Number Puzzle ZOJ - 2836(容斥原理)
Number Puzzle
题意:求不大于m的数中,有多少可以被数组a中的数整除。
二进制枚举,容斥
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }