题目描述
985有 n n个正整数,他想知道存在多少个合法的因子对 (a[i],a[j]) (a[i],a[j])满足:
a[j]%a[i]==0 a[j]%a[i]==0 && i!=j i!=j && 1<=i,j<=n 1<=i,j<=n。其中 i,j i,j是元素的下标,从 1−n 1−n。
特别地,他认为 (a[i],a[j]) (a[i],a[j]) 和 (a[j],a[i]) (a[j],a[i])是相同的。
输入
第一行输入一个整数
T
T,代表有
T
T组测试数据。
每组数据占两行,第一行输入一个 n n代表元素个数,下面一行输入 n n个整数 a[] a[]。
注: 1<=T<=30,1<=n<=10 5 ,1<=a[]<=10 6 1<=T<=30,1<=n<=105,1<=a[]<=106。
每组数据占两行,第一行输入一个 n n代表元素个数,下面一行输入 n n个整数 a[] a[]。
注: 1<=T<=30,1<=n<=10 5 ,1<=a[]<=10 6 1<=T<=30,1<=n<=105,1<=a[]<=106。
输出
一个整数代表最后的答案。
样例输入
2
5
1 2 3 4 5
5
2 2 2 2 2
样例输出
510
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int num[1000010]; int main() { int i,j,t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); int max=-1; memset(num,0,sizeof(num)); for(i=0; i<n; i++) { int a; scanf("%d",&a); num[a]++;//记录每个数出现的次数 if(a>max)//记录最大值 max=a; } int count=0; for(i=1; i<=max; i++) { if(num[i]) for(j=i*2; j<=max; j+=i) count+=num[j]*num[i];//i是当前数,a[i]是当前数的额个数, //j是i的倍数,a[j]是i的倍数的个数,相乘可得因子对数; count+=num[i]*(num[i]-1)/2; //因为重复的数字互相也可以组成因子对,所以如果i有多个的话, //需要将重复数字组成的因子对也算上; } printf("%d\n",count); } return 0; }