题意:
给定n,m,和一个长度为m的数组a
问[1,n]中有多少个数,不被a中的任何数整除
数据范围:n<=2^31,m<=15,a(i)<=n
解法:
反过来想,用总个数减去被整除的个数
答案=n-至少被一个数整除+至少被两个数整除-至少被三个数整除
因为m只有15,所以二进制枚举就行了(2^15=32768)
二进制枚举整除的k个数
根据前面我们推出的式子,根据二进制1的位数,奇减偶加就行了
ps:
代码中lcm不知道会不会爆longlong,不会算
理论上int范围内的15个大质数,计算lcm,好像是会爆的。
但是这题除了lcm我不知道咋做。
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=15;
int a[maxm];
int n,m;
int cal(int x){int ans=0;while(x){ans++;x&=(x-1);}return ans;
}
int lcm(int a,int b){return a/__gcd(a,b)*b;
}
signed main(){ios::sync_with_stdio(0);while(cin>>n>>m){for(int i=0;i<m;i++){cin>>a[i];}int ans=n;for(int i=1;i<(1<<m);i++){int lc=1;for(int j=0;j<m;j++){if(i>>j&1){lc=lcm(lc,a[j]);}}if(cal(i)&1){ans-=n/lc;}else{ans+=n/lc;}}cout<<ans<<endl;}return 0;
}