题目描述
blablabla
样例
blablabla
算法1
(容斥原理) $O(2^m*m)$
把1~n能整除Pi的个数集合为Si,目的就是求S1∪S2∪…∪Sm
∵Pi是质数
∴P1…Pm之间两两互质。
∴GCD(S1∩S2∩…Sm)=1,LCM=(S1∩S2∩…Sm))=P1P2..*Pm.
时间复杂度
参考文献
C++ 代码
#include<iostream>
using namespace std;
typedef long long LL;
const int N = 16;
int a[1<<N];
int p[N];
int main()
{
int n,m,ans=0;
cin>>n>>m;
//质数
for(int i=0;i<m;i++)
cin>>p[i];
//方案数.
for(int i=1;i<1<<m;i++)
{
LL t=1;//记录LCM(质数交集);
LL s=0;//集合个数.
for(int j=0;j<m;j++)
{
if(i>>j&1)
{
t*=p[j];
s++;
}
}
if(s%2)
ans+=n/t;
else
ans-=n/t;
}
cout<<ans<<endl;
return 0;
}