#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=20;
int p[N];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++) cin>>p[i];
int res=0;
for(int i=0;i<1<<m;i++)
{
int t=1,s=0;
for(int j=0;j<m;j++)
{
if((LL)t*p[j]>n)
{
t=-1;
break;
}
t*=p[j];
s++;
}
if(t!=-1)
{
if(s%2)
{
res+=n/t;
}
else
{
res-=n/t;
}
}
}
cout<<res<<endl;
return 0;
}
哭了,这个代码怎么连样例都过不了
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=20;
int p[N];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++) cin>>p[i];
int res=0;
for(int i=0;i<1<<m;i++)
{
int t=1,s=0;
for(int j=0;j<m;j++)
{
if(i>>j&1)
{
if((LL)t*p[j]>n)
{
t=-1;
break;
}
t*=p[j];
s++;
}
}
if(t!=-1)
{
if(s%2)
{
res+=n/t;
}
else
{
res-=n/t;
}
}
}
cout<<res<<endl;
return 0;
}
加了位运算还是过不了
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=20;
int p[N];
int main()
{
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++)
{
int t=1,s=0;
for(int j=0;j<m;j++)
{
if(i>>j&1)
{
if((LL)t*p[j]>n)
{
t=-1;
break;
}
t*=p[j];
s++;
}
}
if(t!=-1)
{
if(s%2)
{
res+=n/t;
}
else
{
res-=n/t;
}
}
}
cout<<res<<endl;
return 0;
}
位运算那儿从1 开始循环
容斥原理,用来去掉重复的部分,二进制1表示选择,0表示不选
n/t表示1~n里面有多少个数字是t 的倍数
t表示的是质数的最小公倍数
s表示的是集合的数目
容斥原理是并集减去交集,加上交集,减去交集,……