【题目描述】

给定一个长度为 \(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. STM32 HAL 使用串口IDLE中断+DMA实现收发

    STM32 HAL 使用串口IDLE中断+DMA实现收发 cubeMX配置 mx配置如下(省去系统时钟,烧录口,工程属性配置) 注意:这里关闭 Force DMA channels Interrupt ...

  2. 重塑元宇宙体验!3DCAT元宇宙实时云渲染解决方案来了

    元宇宙作为人工智能.云计算和数字孪生等前沿技术的结合体,近年来越发受到各大企业重视. 元宇宙的应用场景层出不穷,不仅包括营销推广场景,还有品牌活动和电商销售,能有效提升品宣和商业转化效果. 元宇宙也具 ...

  3. 三维模型3DTile格式轻量化压缩模型变形浅析

    三维模型3DTile格式轻量化压缩模型变形浅析 在对三维模型进行轻量化压缩处理的过程中,常常会出现模型变形的现象.这种变形现象多数源于模型压缩过程中信息丢失或误差累积等因素.以下将对此现象进行详细分析 ...

  4. HeaderedContentControl实现左右对称

    在我们使用TextBlock却想给前面添加固定字段的时候,发现TextBlock没有Header属性, 这个时候我们可以用到HeaderedContentControl 然而,默认情况下Headere ...

  5. 记录--关于无感刷新Token,我是这样子做的

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 什么是JWT JWT是全称是JSON WEB TOKEN,是一个开放标准,用于将各方数据信息作为JSON格式进行对象传递,可以对数据进行可 ...

  6. MySQL备份还原工具

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  7. Amazon免费CE2基于docker部署nginx,并实现访问

    在部署之前,请确保你已经申请好了CE2免费的服务器,网上的相关教程很多,可以自由参考. 一.使用xshell+公钥连接实例 1.打开xshell,导入密钥, 选择"工具" -> ...

  8. 性能测试思想(What is performance testing?)

    1.什么是性能测试 什么是软件性能? 定义:软件的性能是软件的一种非功能特性,它关注的不是软件是否能够完成特定的功能,而是在完成该功能是展示出来的及时性. 比如:一个登录功能他能实现登录操作,但是登录 ...

  9. SpaceDesk怎么连接平板/PC(提高生产力,扩展副屏)

    1.下载安装 分为安卓端和PC端,两个设备都需要安装对应的软件. SpaceDesk官网 https://link.zhihu.com/?target=http%3A//spacedesk.net/ ...

  10. Tomcat内存马分析

    前言 自己简单搭建一个Tomcat项目,IDEA里选择JavaEE,勾上web就行了 加个依赖(这样就能找到三个Context了: <dependency> <groupId> ...