Number Puzzle ZOJ - 2836(容斥原理)

Number Puzzle

 ZOJ - 2836

题意:求不大于m的数中,有多少可以被数组a中的数整除。

二进制枚举,容斥

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[11];
 4 int n,m;
 5 int gcd(int a,int b){
 6     return b?gcd(b,a%b):a;
 7 }
 8 int lcm(int a,int b){
 9     return a/gcd(a,b)*b;
10 }
11 int main(){
12     while(scanf("%d%d",&n,&m)!=EOF){
13         for(int i=0;i<n;i++) scanf("%d",&a[i]);
14         int sta=1<<n;
15         int cnt=0,ans=0;
16         for(int i=1;i<sta;i++){
17             cnt=0;
18             int temp=1;
19             for(int j=0;j<n&temp<=m;j++) if((i>>j)&1) cnt++,temp=lcm(temp,a[j]);
20             if(cnt&1) ans+=m/temp;
21             else ans-=m/temp;
22         }
23         printf("%d\n",ans);
24     }
25 }
View Code

 

posted @ 2017-08-21 09:23  yijiull  阅读(170)  评论(0编辑  收藏  举报