HDU 1796 How many integers can you find(容斥)

来源:互联网 发布:mac打字不显示候选框 编辑:程序博客网 时间:2024/05/19 10:33

题意:

输入n,m以及m个数,输出在1~n中能被m个数的其中一个整除的数的数量

 

解题思路:

用一个数组记录这m个数,以及其中的2个,3个。。。m个数的最小公倍数

能被奇数个数的最小公倍数整除的用+,偶数个用减

 

#include <iostream>using namespace std;#define ll __int64ll a[2000],b[15];int gcd(int a,int b){if(b==0) return a;else gcd(b,a%b);}int main(){ll n,m;while(cin>>n>>m){ll k=1;a[0]=-1;for(ll i=0;i<m;i++) cin>>b[i];for(ll i=0;i<m;i++){ll l=k;if(b[i]==0) continue;for(ll j=0;j<l;j++){int pi;if(a[j]<0) pi=-a[j];else pi=a[j];int t = gcd(pi,b[i]);a[k++] = -1*a[j]/t*b[i]; }}ll ans=0;for(ll i=1;i<k;i++) {ans = ans+(n-1)/a[i];//cout<<a[i]<<" ";}cout<<ans<<endl;}return 0;}


 

0 0