【题目描述】

给定一个长度为 \(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. 简单实用算法——二分查找法(BinarySearch)

    目录 算法概述 适用情况 算法原理 算法实现(C#) 实际应用:用二分查找法找寻边界值 参考文章 算法概述 二分查找(英语:binary search),也叫折半查找(英语:half-interval ...

  2. 回声消除AEC(Acoustic Echo Cancellation)概括介绍及基本原理分析

    回声消除的基本概念   回音消除(Acoustic Echo Cancelling)是透过音波干扰方式消除麦克风与喇叭因空气产生回受路径(feedback path)而产生的杂音.通俗一点来说,回声消 ...

  3. day07-Java方法01

    Java方法01 1.什么是方法? Java是语句的集合,它们在一起执行一个功能 方法是解决一类问题的步骤的有序集合 方法包含于类或者对象中 方法在程序中被创建,在其他地方被引用 设计方法的原则:方法 ...

  4. 2、Azure Devops之Azure Boards使用

    1.什么是Azure Boards 使用面板.积压工作.冲刺.查询管理项目的用户故事.待办事项.任务.特性和bug. 2.工作项(WorkItem) 工作项管理的可以管理和创建用户故事.特性.任务. ...

  5. Performance Improvements in .NET 8 -- Exceptions & Reflection & Primitives【翻译】

    Exceptions 在 .NET 6 中,ArgumentNullException 增加了一个 ThrowIfNull 方法,我们开始尝试提供"抛出助手".该方法的目的是简洁地 ...

  6. uni-app 地图全解析+事件监听

    最近找到了一篇uni-app的地图解决方案精品文章,这里分享给大家,希望对大家有所帮助 转载地址:https://blog.csdn.net/cplvfx/article/details/111447 ...

  7. .NET Emit 入门教程:第六部分:IL 指令:1:概要介绍

    前言: 在之前的文章中,我们完成了前面五个部分的内容学习,包括: 第一部分:Emit介绍 第二部分:构建动态程序集 第三部分:构建模块(Module) 第四部分:构建类型(Type) 第五部分:动态生 ...

  8. .NET周刊【3月第3期 2024-03-24】

    国内文章 Garnet: 力压Redis的C#高性能分布式存储数据库 https://www.cnblogs.com/InCerry/p/18083820/garnet_introduce 微软研究院 ...

  9. java代码输出控制台输出菱形

    private static void rhombFuncation() { int row = 3; for (int i = 1; i <= row; i++) { for (int row ...

  10. KingbaseES生成动态SQL

    1. 动态SQL 动态SQL在程序启动时会根据输入参数替换相应变量.使用动态SQL可以创建更强大和灵活的应用程序,但在编译时SQL语句的全文不确定,因此运行时编译会牺牲一些性能.动态SQL可以是代码或 ...