HDU1796 How many integers can you find(容斥原理)

题目给一个数字集合,问有多少个小于n的正整数能被集合里至少一个元素整除。

当然是容斥原理来计数了,计算1个元素组合的有几个减去2个元素组合的LCM有几个加上3个元素组合的LCM有几个。注意是LCM。

  • 而[1,n]中能被x整除的数字有$ \lfloor \frac nx \rfloor$个,因为设有$t$个,$x \times t \leqslant n$。
  • 计算多个数LCM利用:$lcm(a,b)=a/gcd(a,b)\times b $,$lcm(a,b,c)=lcm(a,lcm(b,c))$
 #include<cstdio>
#include<cstring>
using namespace std;
int gcd(int a,int b){
if(b==) return a;
return gcd(b,a%b);
}
int lcm(int a,int b){
return a/gcd(a,b)*b;
}
int getCnt(int s){
int res=;
for(int i=; i<; ++i){
if((s>>i)&) ++res;
}
return res;
}
int main(){
int n,m,a[];
while(~scanf("%d%d",&n,&m)){
--n;
int t=;
while(m--){
scanf("%d",&a[t]);
if(a[t]) ++t;
}
m=t;
int ans=;
for(int i=; i<(<<m); ++i){
int res=;
for(int j=; j<m; ++j){
if(a[j]== || ((i>>j)&)==) continue;
res=lcm(res,a[j]);
}
if(getCnt(i)&) ans+=n/res;
else ans-=n/res;
}
printf("%d\n",ans);
}
return ;
}
上一篇:Backbone.js 中的Model被Destroy后,不能触发success的一个原因


下一篇:修改计算机名后SQLServer无法使用windows账号登录