hdu 1796
一下午 终于行了
基本的容斥定理
收藏
2314
容斥原理
编辑
在计数时,必须注意无一重复,无一遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。
目录
1公式编辑
也可表示为
设S为有限集,
,则
#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\n",sum);
}
return 0;
}