【模板】容斥原理

 1 #include<cstdio>
 2 int num[6] = {2,3,5,7};
 3 int n;
 4 int solve()
 5 {
 6     int ans = 0;        //是那四个数的倍数的数的数量 
 7     for (int i = 1 ; i < (1<<4) ; i++)        //选数 
 8     {
 9         int ant = 0;        //选中数的数量 
10         int k = 1;        //记录选中数字的乘积 
11         for (int j = 0 ; j < 4 ; j++)
12         {
13             if (i & (1<<j))        //检测第j个数有没有被选中 
14             {
15                 ant++;
16                 k *= num[j];
17             }
18         }
19         if (ant & 1)        //ant % 2 == 1  表示奇数 
20             ans += n / k;
21         else
22             ans -= n / k;
23     }
24     return ans;
25 }
26 int main()
27 {
28     scanf ("%d",&n);
29     printf ("%d\n",n-solve());
30 //    printf("**%d**\n", 1<<3);
31     return 0;
32 }
33 /*
34 4 = 2^4 = 16
35 
36 2 3 5 7
37 0 0 0 0
38 0 0 0 1
39 0 0 1 0
40 ......
41 1 1 1 1
42 */

 

posted @ 2017-07-30 18:03  ⊙∽⊙Perseverance  阅读(177)  评论(0编辑  收藏  举报