【题目描述】

给定一个长度为 \(N\) 的非负整数序列 \(A=\left(A_1,\cdots,A_n\right)\)。求满足以下条件的整数对 \(\left(i,j\right)\) 的数量。

  • \(1\le i < j \le n\)
  • \(A_iA_j\) 是平方数

其中,如果某个非负整数 \(a\) 可以用某个非负整数 \(d\) 表示为 \(a=d^2\),那么称 \(a\) 是平方数。

【思路】

首先发现,一个数是平方数,当且仅当这个数的所有质因数的次数都是偶数。

因为 \(a\) 是平方数,考虑 \(a=d^2\),\(d\) 的分解为 \(d={p_1}^{q_1} {p_2}^{q_2} \cdots {p_n}^{q_n}\)。

则 \(a\) 的分解为 \(a={p_1}^{2q_1} {p_2}^{2q_2} \cdots {p_n}^{2q_n}\)​​。

所以 \(a\)​ 的所有质因数的次数都是偶数。

那么,两个数 \(A,B\)​ 的积是平方数,说明了这么个事:

  • \(A,B\) 两数都是平方数(每个质因子次数都是偶数):那做完乘法之后还是平方数(质因子次数还是偶数)

  • \(A,B\)​ 两个数,每个数都有次数是奇数的质因子,这些质因子是相同的,所以在做完乘法之后消去了。

举个例子:

  • 两个数都是平方数,乘法之后还是平方数:

    \(\begin{array}{c}
    \ \ \ \ \ \ \ \ A=2^2 \times 3^6 \times 7^4 \\
    \ \ \ \ \ \ \ \ B=2^2 \times 3^2 \times 7^2 \\
    A\times B=2^4 \times 3^8 \times 7^6
    \end{array}\)

  • 两个数都有次数是奇数的质因子,在做完乘法之后消去了:

    \(\begin{array}{c}
    \ \ \ \ \ \ \ \ A=2^2 \times 3^3 \times 7^1 \\
    \ \ \ \ \ \ \ \ B=2^2 \times 3^3 \times 7^5 \\
    A\times B=2^4 \times 3^6 \times 7^6
    \end{array}\)

所以我们可以得出一个普遍规律:

对于两个数,他们次数是奇数的质因子相同,那么两个数在做完乘法之后就是一个平方数。

但是这题有个坑,\(A_i\) 可能是 \(0\),所以要特判一下:

  • \(0\times0=0\) 是一个平方数
  • \(0\) 乘以任何数都是 \(0\)

于是这道题就4发罚时愉快的做完了。

嗯。

【Code】

#include <bits/stdc++.h>
#define int long long
using namespace std; int n,a[200005],Zero,ans;
map<int,int>s; //筛质数,加速找质因子
int Primes[200005],tot;
bool vis[200005];
void Search_primes(int n){
memset(vis,true,sizeof(vis));
vis[0]=vis[1]=0;
for(int i=2;i<=n;i++){
if(vis[i]) Primes[++tot]=i;
for(int j=1;j<=tot and i*Primes[j]<=n;j++){
vis[i*Primes[j]]=0;
if(i%Primes[j]==0) break;
}
}
} //计算一个数次数为奇数的质因子
int Bu(int x){
if(x==0) return 0;
int res=1,X=x;
for(int i=1;i<=tot;i++){
if(Primes[i]*Primes[i]>X) break;
if(x%Primes[i]==0){
int sum=0;
while(x%Primes[i]==0) x/=Primes[i],sum++;
if(sum%2==1) res*=Primes[i];
}
}
if(x>1) res*=x;
return res;
} signed main()
{
scanf("%lld",&n);
Search_primes(n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
s[Bu(a[i])]++;
if(a[i]==0) Zero++;
}
for(auto it:s){
int sum=it.second;
ans+=sum*(sum-1)/2;
}
printf("%lld",ans+Zero*(n-Zero));
return 0;
}

【后记】

祝大家上分。

由于手速不够快没交上题解。。。

[ABC342D] Square Pair 题解的更多相关文章

  1. CF934A A Compatible Pair 题解

    Content 有两个数列 \(A\) 和 \(B\),\(A\) 数列里面有 \(n\) 个元素,\(B\) 数列里面有 \(m\) 个元素,现在请从 \(A\) 数列中删除一个数,使得 \(A\) ...

  2. 竞赛题解 - [CF 1080D]Olya and magical square

    Olya and magical square - 竞赛题解 借鉴了一下神犇tly的博客QwQ(还是打一下广告) 终于弄懂了 Codeforces 传送门 『题目』(直接上翻译了) 给一个边长为 \( ...

  3. hdu_5877_Weak Pair(离散+DFS+树状数组)

    题目链接:hdu_5877_Weak Pair 题意: 给你一棵树,让你找有多少对满足那两个条件的weak pair 题解: 有人用Treap,我不会,然后我用树状数组+离散来替代Treap,用DFS ...

  4. Codeforces Round #448 C. Square Subsets

    题目链接 Codeforces Round #448 C. Square Subsets 题解 质因数 *质因数 = 平方数,问题转化成求异或方程组解的个数 求出答案就是\(2^{自由元-1}\) , ...

  5. 题解报告:hdu 1398 Square Coins(母函数或dp)

    Problem Description People in Silverland use square coins. Not only they have square shapes but also ...

  6. 【题解】P4755 Beautiful Pair(启发式合并的思路+分治=启发式分治)

    [题解]P4755 Beautiful Pair upd: 之前一个first second烦了,现在AC了 由于之前是直接抄std写的,所以没有什么心得体会,今天自己写写发现 不知道为啥\(90\) ...

  7. LeetCode 题解 593. Valid Square (Medium)

    LeetCode 题解 593. Valid Square (Medium) 判断给定的四个点,是否可以组成一个正方形 https://leetcode.com/problems/valid-squa ...

  8. 题解 CF934A 【A Compatible Pair】 ——贪心

    题意: 给定两个数列 \(A\) . \(B\) ,元素个数分别为 \(n\) , \(m\) \((2 \le n,m \le 50)\) .数列中所有元素大小均在 \(-10^{9}\) 到 \( ...

  9. LeetCode题解:(221) Maximal Square

    题目说明 Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's a ...

  10. 【CF1436B】Prime Square 题解

    原题链接 题意简介 要求构造一个由不大于 1e5 的非负数构成的正方形矩阵,矩阵的每个元素不是质数,但每一行.每一列的数字的和都是质数. 思路分析 看到样例二,我们知道数字可以重复. 于是,我们很容易 ...

随机推荐

  1. 【数据结构】C语言实现动态扩容数组

    // resizable array /* Think about a set of functions that provide a mechanism of resizable array of ...

  2. python中把列表中的字符串转成整型的几种方法

    python中在不同类型数据转换方面是有标准库的,使用非常方便.但是在开发中,经常在list中字符转成整形的数据方便遇到问题.这里就记录一下常用的几种方法. 方法一:最基本的方法:通过轮训整个list ...

  3. 完美解决浏览器输入http被自动跳转至https问题

    查阅相关资料,发现这是浏览器的HSTS(HTTP Strict Transport Security)功能引起的.在安装配置SSL证书时,可以使用一种能使数据传输更加安全的Web安全协议,即在服务器端 ...

  4. day05-Lombok、SpringInitializer

    Lombok.Spring-Initializer 1.Lombok 1.1Lombok介绍 Lombok的作用是: 简化Javabean的开发,可以使用Lombok的注解让代码更加简洁 Java项目 ...

  5. 🚀🚀🚀Elasticsearch 主副分片切换过程中对业务写入有影响吗

    先说下结论,只要集群中的工作节点过半,有候选的master节点,挂掉的节点中不同时包含索引的主分片和副分片,那么ES是可以做到让业务无感知的进行主副分片切换的. 蓝胖子会先讲解下ES集群写入文档的原理 ...

  6. .net core 多线程下使用 Random 会出现bug

    .net core 多线程下使用 Random 会出现的bug 先看原文: Working with System.Random and threads safely in .NET Core and ...

  7. 游戏引擎中的实时渲染和在V-Ray中渲染有什么区别 2022-11-25

    游戏引擎中的实时渲染和在V-Ray中渲染有什么区别,下面我们一起来分析一下,从2个方面来具体分析实时渲染和在V-Ray中渲染种的不一样的区别. 原理区别 VRay等渲染器原理上叫做离线渲染(Offli ...

  8. 三维模型3DTile格式轻量化压缩必要性分析

    三维模型3DTile格式轻量化压缩必要性分析 理解3DTile格式轻量化压缩的必要性,首先需要理解三维模型的复杂性和数据量.三维模型通常包含大量的顶点.面片和纹理信息,这使得其数据量非常大,尤其对于大 ...

  9. springboot整合视频点播

    1 //上传视频到阿里云 2 @Override 3 public String uploadAyl(MultipartFile file) { 4 try { 5 //accessKeyId,acc ...

  10. ZYNQ7000系列学习

    ZYNQ7000-系列知识学习 一.ZYNQ7000简介 ZYNQ7000是xilinx推出的具有ARM内核的FPGA芯片,可用于常见SOC开发.基于此,通过学习ZYNQ7000的各种设置和开发,可以 ...