Prime
如果a,b的最大公约数是1,说明a,b是一对互素的数,给定你n个数字,希望你找出互素的数的对数
Input
第一行输入一个正整数T,表示数据组数
每组数据第一行输入一个正整数n,表示数字的个数(n<=10000)
接下来一行输入n个正整数,每个数字大小不超过1000。
Output
输出互素的数的对数
Sample Input
1
4
10 9 6 35
Sample Output
3
题意:中文很好理解。
分析:数字的个数是10000,如果直接暴力肯定会超时间,但注意到每个数的大小不超过1000,这要直接枚举1000以内的任意两个数就行了,然后记录每个数出现的次数,当i,j互为质数,互质的对数cnt就加上啊a[i]*a[j],a[i]表示数字i出现的次数。
代码:
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<vector>
#include<math.h>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
int GCD(int a,int b){
//求最大公约数
if (b==0)return a;
GCD(b,a%b);
}
int n;
int a[1005];
int main ()
{
int t;
scanf ("%d",&t);
while (t--){
scanf ("%d",&n);
int tmp;
memset (a,0,sizeof(a));
for (int i=0;i<n;i++){
scanf ("%d",&tmp);
a[tmp]++;
}
long long cnt=0;
cnt=a[1]*(a[1]-1)/2;
for (int i=1;i<=1000-1;i++){
for (int j=i+1;j<=1000;j++){
//当i,j互为质数时,cnt加上两者数目的乘积
if (GCD(i,j)==1)cnt+=(long long)a[i]*a[j];
}
}
//输出结果
printf ("%lld\n",cnt);
}
return 0;
}