标签:style blog http color io os ar java for
4 2 3 4 5 4 2 4 6 8 7 2 3 4 5 7 6 8
1 0 34
题意:给10^4个数字,最大数字不超过10^4. 求4元组 gcd(x,y,z,k)=1 ;
思路:莫比乌斯。 统计F【i】的数字的个数。 F(d) = Cnm(F[d],4)种方案。
1 #include<iostream> 2 #include<stdio.h> 3 #include<cstring> 4 #include<cstdlib> 5 using namespace std; 6 const int N = 1e4+5; 7 8 int vis[N]; 9 int mu[N]; 10 int prime[N],cnt; 11 int num[N]; 12 int Hash[N]; 13 14 void init() 15 { 16 memset(vis,0,sizeof(vis)); 17 mu[1] = 1; 18 cnt = 0; 19 for(int i=2;i<N;i++) 20 { 21 if(!vis[i]) 22 { 23 prime[cnt++] = i; 24 mu[i] = -1; 25 } 26 for(int j = 0;j<cnt&&i*prime[j]<N;j++) 27 { 28 vis[i*prime[j]] = 1; 29 if(i%prime[j]) mu[i*prime[j]] = -mu[i]; 30 else 31 { 32 mu [i *prime[j]] = 0; 33 break; 34 } 35 } 36 } 37 } 38 long long Cnm(int n,int m) 39 { 40 if(n<m)return 0; 41 long long nn=n; 42 long long mm=m; 43 long long i,j; 44 long long sum = 1; 45 for(i=1,j=nn;i<=mm;i++,j--) 46 sum = sum *j/i; 47 return sum; 48 } 49 int main() 50 { 51 int n,x; 52 init(); 53 while(scanf("%d",&n)>0) 54 { 55 memset(num,0,sizeof(num)); 56 memset(Hash,0,sizeof(Hash)); 57 int maxn = 0; 58 for(int i=1;i<=n;i++){ 59 scanf("%d",&x); 60 Hash[x]++; 61 if(x>maxn) maxn=x; 62 } 63 for(int i=1;i<=maxn;i++) 64 { 65 for(int j=i;j<=maxn;j=j+i) 66 num[i]=num[i]+Hash[j]; 67 } 68 long long sum = 0; 69 for(int i=1;i<=maxn;i++){ 70 long long tmp = Cnm(num[i],4); 71 sum = sum+tmp*mu[i]; 72 } 73 printf("%I64d\n",sum); 74 } 75 return 0; 76 }
标签:style blog http color io os ar java for
原文地址:http://www.cnblogs.com/tom987690183/p/4032694.html