首页 > 其他分享 >abc342D 乘积为完全平方数的对数

abc342D 乘积为完全平方数的对数

时间:2024-03-09 10:13:13浏览次数:20  
标签:map cnt 乘积 int cnt0 平方 ans 对数 abc342D

题面:给定长为n的数组A,问有多少对下标(i,j)满足A[i]*A[j]为完全平方数?
范围:n<=2E5; A[i]<=2E5

思路:完全平方数即质因子的个数为偶数,因此对元素进行化简,把偶次质因子都去掉,再统计即可。另外,0乘任何数都为0,需要单独处理。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a; i<=b; i++)
#define per(i,a,b) for(int i=b; i>=a; i--)

map<int,int> factor(int z) {
    map<int,int> p;
    for (int i = 2; i <= z/i; i++) {
        while (z % i == 0) {
            p[i] += 1;
            z /= i;
        }
    }
    if (z > 1) p[z] += 1;
    return p;
}

void solve() {
    int n;
    cin >> n;
    int ans = 0, cnt0 = 0;
    map<int,int> cnt;
    rep(i,1,n) {
        int A;
        cin >> A;
        if (A == 0) {
            ans += i-1;
            cnt0 += 1;
            continue;
        }
        int a = 1;
        for (auto [k,v] : factor(A)) {
            if (v % 2) a *= k;
        }
        ans += cnt[a] + cnt0;
        cnt[a] += 1;
    }
    cout << ans << "\n";
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

标签:map,cnt,乘积,int,cnt0,平方,ans,对数,abc342D
From: https://www.cnblogs.com/chenfy27/p/18062294

相关文章

  • 笛卡尔乘积
    SQL中的笛卡尔积SQL中的笛卡尔积是数学集合论中的一个术语。但是,我们也可以在SQL数据库手册中找到这个术语。它意味着什么,我们应该如何使用它?让我们来学习一下。两个集合X和Y的笛卡尔积,表示为X×Y,是所有有序对的集合,其中x在X中,y在Y中。就SQL而言,笛卡尔积是......
  • 基于preparedStatement对数据的增删改查,以及全自动遍历
    1packagecom.atsyc.api.preparedstatement;23/*4*使用preparedStatement进行t_user表的增删改查动作5*/67importcom.mysql.cj.xdevapi.PreparableStatement;8importorg.junit.Test;910importjava.sql.*;11importjava.util.*;......
  • P5609 [Ynoi2013] 对数据结构的爱
    题面传送门好像搞了个神秘做法。考虑离线扫描线,用一个fhq-Treap维护所有的询问现在长什么样,然后每次操作就整体加\(A_i\),\(\geqp\)的减去\(p\),这个可以分裂之后打整体标记,然后用那个值域相交的fhq-Treap合并实现。然后你发现这样就过了。构造一下卡不掉,于是考虑给这个......
  • 中国联通全球托管运维服务:助力企业无忧应对数据中心运维挑战
    在全球化背景下,企业的信息化进程不断加快,数据中心作为支撑关键业务的核心基础设施,在全球范围内的布局与运维变得愈发重要。然而,企业在设立异地或海外数据中心时,常常面临资源有限、人力短缺等问题,特别是在目标地缺乏专业的IT工程师团队时,如何确保数据中心的稳定运行与高效管理成为......
  • 乘积尾零 612
    如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?565045423554473946411438719073904329275879496113565952457432305144346704359499371173686633974759755730702287145398991486572231351170401455105120729288090192......
  • 【C++】相对于数组,在链表中添加和删除元素更容易,但排序速度更慢。这就引出了一种可能
    相对于数组,在链表中添加和删除元素更容易,但排序速度更慢。这就引出了一种可能性:相对于使用链表算法进行排序,将链表复制到数组中,对数组进行排序,再将排序后的结果复制到链表中的速度可能更快;但这也可能占用更多的内存。请使用如下方法检验上述假设。a.创建大型vector<int>对象vi0,并......
  • [ABC342D] Square Pair 题解
    洛谷传送门原题传送门题意给出一个数列\(A\),求出满足\(A_iA_j\)为完全平方数的无序数对\((i,j)\)的个数。分析容易想到(但是我在昨晚没想到,可以原地AFO了),对于每个数,如果是\(0\)的话可以直接统计答案(记录\(0\)的个数\(cnt\),最后\(ans\leftarrowans+cnt(n-cnt)+\f......
  • 【C++】编写一个具有老式风格接口的函数,其原型如下:int reduce(long arr[], int n)。实
    #include<iostream>#include<string>usingnamespacestd;intreduce(longarr[],intn){sort(arr,arr+n);autostr=unique(arr,arr+n);returnstr-arr;}intmain(){longarr[10]={15,8,5,6,11,11,6,6,198,50};......
  • 1339. 分裂二叉树的最大乘积
    这道题关键突破点就是先算出节点总和,然后找到一颗子树总和最接近总和的一半。乘积最大基本就是先要求总和,然后找到最接近总和一半。关键就是这一步,找到最适合子树的和。点击查看代码if(abs(2*cur-sum)<abs(2*best-sum)){best=cur;}完整代码:点击查看......
  • F. 乘积最大(题解)
    题目今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:设有一个长度为......