marcool 0200 互质二元组 数论

题意:给出N个整数A1A2,……,AN,统计满足i<jAiAj互质的二元组(ij)的数量。

对于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 }

 

 

posted on 2012-07-21 17:57  myoi  阅读(282)  评论(0编辑  收藏  举报

导航