一下午 终于行了
基本的容斥定理
收藏
2314
容斥原理
编辑
在计数时,必须注意无一重复,无一遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。
目录
1公式编辑
![](http://c.hiphotos.baidu.com/baike/s%3D149/sign=ee71cbe41c950a7b71354ac033d0625c/bf096b63f6246b60ae4a22a6eaf81a4c500fa298.jpg)
![](http://g.hiphotos.baidu.com/baike/s%3D598/sign=bf55d61283025aafd7327ec2c3ecab8d/8ad4b31c8701a18be990829d9f2f07082938feed.jpg)
也可表示为
设S为有限集,
,则
![](http://f.hiphotos.baidu.com/baike/s%3D192/sign=2ee170943812b31bc36cc920b4193674/3c6d55fbb2fb4316304e96a921a4462308f7d394.jpg)
![](http://a.hiphotos.baidu.com/baike/s%3D384/sign=79d25d2838dbb6fd215be32e3d25aba6/8b82b9014a90f6035b8575943812b31bb051ed28.jpg)
#include<iostream>
int a[12];__int64 n;
__int64 sum;
int m;
__int64 gcd(__int64 x,__int64 y)
{
__int64 t;
if(x<y)
{
t=x;
x=y;
y=t;
}
while(y)
{
t=x%y;
x=y;
y=t;
}
return x;
}
void dfs(int j,__int64 lcm,int num)
{
if(num>m) return ;
lcm=lcm*a[j]/gcd(lcm,a[j]);
if(num%2==0) sum-=(n-1)/lcm;
else sum+=(n-1)/lcm;
for(int i=j+1;i<m;i++)
dfs(i,lcm,num+1);
}
int main()
{
while(scanf("%I64d%d",&n,&m)!=EOF)
{
for(int i=0;i<m;i++)
{
scanf("%d",&a[i]);
if(a[i]==0)
i--,m--;
}
sum=0;
for(i=0;i<m;i++)
dfs(i,a[i],1);
printf("%I64d ",sum);
}
return 0;
}