感觉走马观花,没有理解
奇数加
偶数减
容斥原理有多种证明,此处是用恒等不等式来证明
具体见大佬博客
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 20;
int n,m;
int p[N];
int main(){
cin >> n >> m;
for(int i = 0; i < m; i++) cin >> p[i];
ll res = 0;
for(int i = 1; i < (1 << m); i++){
int t = 1;//当前所有质数的乘积
int cnt = 0; //1的个数 当前i里面包含几个1,当前i里有多少个集合。
for(int j = 0; j < m; j++){
if(i >> j & 1){//如果当前这里为1时
cnt++;
if((1ll) * t * p[j] > n){//超过了就不用算了
t = -1;//有些没有理解???
break;
}
t *= p[j];
}
}
if(t != -1){
if(cnt % 2) res += n/t;
else res -= n/t;
}
}
cout << res << endl;
return 0;
}