能被整除的数
给定一个整数 n和 m个不同的质数 p1,p2,…,pm。
请你求出 1∼n中能被 p1,p2,…,pm中的至少一个数整除的整数有多少个。
输入格式
第一行包含整数 n 和 m。
第二行包含 m 个质数。
输出格式
输出一个整数,表示满足条件的整数的个数。
数据范围
1≤m≤16,
1≤n,pi≤109
输入样例:
10 2
2 3
输出样例:
7
#include<iostream>
#include<algorithm>
#include<bitset>
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];
int res = 0;//答案
for(int i=1;i< 1 << m;i++){
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){
t=-1;
break;
}
t *= p[j];
}
if(t!=-1){
if(cnt%2) res+=n/t;
else res-=n/t;
}
}
printf("%d\n",res);
return 0;
}