容斥原理加二进制枚举,题目意思是让我们找从1到n-1中有多少个能被m序列中的数整除的个数(被任意一个整除都可以),接下来就是一个简单的二进制枚举的题了,遵循奇加偶减的原则,然后就可以敲了,不会二进制枚举的可以私戳这位的博客

注意多组输入和long long

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int gcd(int a,int b) {
return b==0?a:gcd(b,a%b);
}
int main() {
int n,m;
ll a[20];
ll data;
while(~scanf("%d%d",&n,&m)) {
int t=0;
for(int i=0; i<m; i++) {
scanf("%lld",&data);
if(data!=0)
a[t++]=data;
}
ll ans=0;
for(int i=1; i<(1<<t); i++) {
int cnt=0;
ll lcm=1;
for(int j=0; j<t; j++) {
if((1<<j)&i) {
cnt++;
lcm=lcm*a[j]/gcd(lcm,a[j]);
}
}
if(cnt%2==1)
ans+=(n-1)/lcm;
else if(cnt%2==0)
ans-=(n-1)/lcm;
}
printf("%lld\n",ans);
}
return 0;
}