点击这里查看原题
典型的容斥原理,枚举所有取数情况求最小公倍数
有几个坑需要注意:
- 输入的数可能有0
- 所有数的最小公倍数可能会爆int
/*
User:Small
Language:C++
Problem No.:1796
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using 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;
}