容斥原理

容斥原理:

      是指在计数时,必须注意无一重复,无一遗漏,为了使重叠部分不被重复计算,人们研究出一种新的计数方法。基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目计算出来,然后再把计数时重复计算的数目排除出去,使得计算的结果既无遗漏也无重复,这种计数方法称为容斥原理。

公式:

容斥原理_第1张图片

 

例题:

1.   某校六⑴班有学生45人,每人在暑假里都参加体育训练队,其中参加足球队的有25人,参加排球队的有22人,参加游泳队的有24人,足球、排球都参加的有12人,足球、游泳都参加的有9人,排球、游泳都参加的有8人,问:三项都参加的有多少人?

分析:参加足球队的人数25人为A类元素,参加排球队人数22人为B类元素,参加游泳队的人数24人为C类元素,既是A类又是B类的为足球排球都参加的12人,既是B类又C类的为足球游泳都参加的9人,既是C类又是A类的为排球游泳都参加的8人,三项都参加的是A类B类C类的总和设为X。注意:这个题说的每人都参加了体育训练队,所以这个班的总人数即为A类B类和C类的总和。

答案:25+22+24-12-9-8+X=45解得X=3

2.    在1到1000的自然数中,能被3或5整除的数共有多少个?不能被3或5整除的数共有多少个?

分析:显然,这是一个重复计数问题(当然,如果不怕麻烦你可以分别去数3的倍数,5的倍数)。我们可以把“能被3或5整除的数”分别看成A类元素和B类元素,能“同时被3或5整除的数(15的倍数)”就是被重复计算的数,即“既是A类又是B类的元素”。求的是“A类或B类元素个数”。我们还不能直接计算,必须先求出所需条件。1000÷3=333……1,能被3整除的数有333个(想一想,这是为什么?)同理,可以求出其他的条件。

 

实现: 使用DFS的方式实现容斥原理,复杂度为O(2^sz)

int dfs(int st, int now)

{

  int ret = n / now;

  for(int i = st; i < sz; i++) {

     ret -= dfs(i + 1, now*a[i]);

  }

  return ret;

}

 

 

你可能感兴趣的:(容斥原理)