marcool 0200 互质二元组 数论
题意:给出N个整数A1,A2,……,AN,统计满足i<j且Ai和Aj互质的二元组(i,j)的数量。
对于100%的数据,1 ≤ N ≤ 100000,1 ≤ Ai ≤ 1000000。
思路: 因为Ai比较小 所以我们用num[i]统计n个数中i的个数
然后先求出 分别以2~1000000为公约数的有多少对
再求出以2~1000000为最大公约数的有多少对
最后用n*(n-1)/2减去总对数
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cmath> 5 #define MAXM 1000000 6 #define MAXN 110000 7 long long num[MAXM+1]; 8 long long ans[MAXM+1]; 9 int n; 10 void solve() 11 { 12 int i,x; 13 for(x=2;x<=MAXM;x++) 14 for(i=x;i<=MAXM;i+=x) 15 ans[x]+=num[i]; 16 for(x=2;x<=MAXM;x++) 17 ans[x]=ans[x]*(ans[x]-1)/2; 18 for(x=MAXM;x>1;x--) 19 for(i=2*x;i<=MAXM;i+=x) 20 ans[x]-=ans[i]; 21 long long s=0; 22 for(x=2;x<=MAXM;x++) 23 s+=ans[x]; 24 s=(long long)n*(n-1)/2-s; 25 printf("%lld\n",s); 26 } 27 28 int main() 29 { 30 memset(num,0,sizeof(num)); 31 int x,i; 32 scanf("%d",&n); 33 for(i=1;i<=n;i++) 34 { 35 scanf("%d",&x); 36 num[x]++; 37 } 38 solve(); 39 return 0; 40 }