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 }

 

posted @ 2013-07-21 20:21  Naix_x  阅读(182)  评论(0编辑  收藏  举报