AcWing 890. 能被整除的数
原题链接
简单
作者:
minux
,
2020-05-01 09:36:34
,
所有人可见
,
阅读 501
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=20;
int p[N];
int n, m;
int main(){
// 容斥原理计数, 位运算枚举所有的集合
memset(p, 0x00, sizeof p);
cin>>n>>m;
for(int i=0; i<m; ++i) cin>>p[i];
int res=0;
for(int i=1; i<1<<m; ++i){ // 枚举所有非空子集(2^m-1)个
LL prod=1; // 存储当前乘积
int cnt=0; // 存储选取集合中元素的个数
for(int j=0; j<m; ++j){
if(i>>j&0x01){
++cnt;
if(prod*p[j]>n){ // 对于超过n的的情况不需要考虑
prod=-1;
break;
}
prod*=p[j];
}
}
if(prod!=-1){ // 如果是偶数个元素则加上, 奇数个元素则减去
if(cnt&0x01) res+=n/prod;
else res-=n/prod;
}
}
cout<<res<<endl;
return 0;
}