看上图可能会很迷,我们直接看例题。
例题一:
很经典的容斥,我们可以用二进制枚举来枚举所有的集合。
对于每一个集合的正负号,就是该集合内的集合数。例如:
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
LL a[25],n,m,sum;
LL solve(LL n)
{
LL sum=0;
for(int i=1;i<(1<<m);i++)//注意从1开始
{
LL temp=n,cnt=-1;
for(int j=0;j<m;j++)
{
if(i>>j&1)
{
temp/=a[j],cnt=cnt*(-1);
}
}
sum=sum+cnt*temp;
}
return sum;
}
int main(void)
{
cin>>n>>m;
for(int i=0;i<m;i++) cin>>a[i];
cout<<solve(n);
return 0;
}