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 }

 

你可能感兴趣的:(uva)