[HDU 1796]How many integers can you find:容斥原理

来源:互联网 发布:雪梨淘宝店名叫什么 编辑:程序博客网 时间:2024/06/11 00:58

点击这里查看原题

典型的容斥原理,枚举所有取数情况求最小公倍数
有几个坑需要注意:

  • 输入的数可能有0
  • 所有数的最小公倍数可能会爆int
/*User:SmallLanguage:C++Problem No.:1796*/#include<bits/stdc++.h>#define ll long long#define inf 999999999using namespace std;int n,m,p[15];ll gcd(ll a,ll b){    return b==0?a:gcd(b,a%b);}ll lcm(ll a,ll b){    return a/gcd(a,b)*b;}int main(){    freopen("data.in","r",stdin);//    while(cin>>n>>m){        int tot=0;        for(int i=1;i<=m;i++)            cin>>p[i];        for(int i=1;i<=m;i++)            if(p[i]) p[++tot]=p[i];        m=tot;        int ans=0;        for(int i=1;i<(1<<m);i++){            ll u=1,cnt=0;            for(int j=0;j<m;j++){                if((i>>j)&1){                    cnt++;                    u=lcm(u,p[j+1]);                }            }            ans+=(n-1)/u*(cnt%2?1:-1);        }        cout<<ans<<endl;    }    return 0;}
0 0
原创粉丝点击