题面:
样例:
思路:
代码:
#include<iostream>
using namespace std;
typedef long long LL;
const int N = 20;
int p[N];
int main (void)
{
int n,m;
cin >> n >> m;
for(int i=0;i<m;i++)
{
cin >> p[i];
}
int res = 0;
for(int i = 1;i < 1 << m;i++) //在第i位上进行判断,1<<m代表2^m
{
int t = 1,cnt = 0; //t表示当前所有质数乘积 cnt代表有多少个1
for(int j = 0;j<m;j++)
if(i >> j & 1)
{
cnt++;
if((LL)t * p[j] > n) //如果分母大于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;
}