UVA 10325 - The Lottery(容斥)
以前做过的一个题,忘记/gcd了,看来需要把以前的东西看一下啊。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 #define LL long long 8 int p[21],flag[21]; 9 LL gcd(LL a,LL b) 10 { 11 return b == 0?a:gcd(b,a%b); 12 } 13 int main() 14 { 15 int n,i,j,ans,num,m; 16 LL temp; 17 while(scanf("%d%d",&n,&m)!=EOF) 18 { 19 ans = 0; 20 memset(flag,0,sizeof(flag)); 21 for(i = 0;i < m;i ++) 22 scanf("%d",&p[i]); 23 sort(p,p+m); 24 num = 0; 25 for(i = 0;i < m;i ++) 26 { 27 if(!flag[i]) 28 p[num++] = p[i]; 29 for(j = i+1;j < m;j ++) 30 { 31 if(p[j]%p[i] == 0) 32 flag[j] = 1; 33 } 34 } 35 m = num; 36 for(i = 1;i < (1<<m);i ++) 37 { 38 temp = 1; 39 num = 0; 40 for(j = 0;j < m;j ++) 41 { 42 if(i&(1<<j)) 43 { 44 temp = temp*p[j]/gcd(temp,p[j]); 45 num ++; 46 } 47 } 48 if(num%2) 49 ans += n/temp; 50 else 51 ans -= n/temp; 52 } 53 printf("%d\n",n-ans); 54 } 55 return 0; 56 }