首页 > 代码库 > 容斥原理

容斥原理

容斥原理简介(很无耻的把ysy神犇讲课的课件摘抄下来了):

记f(S)表示满足集合S中至少一个条件的方案数,g(S)表示满足集合S中所有条件的方案数。
f(S)=Σ(-1)^(|T|-1)*g(T),其中T为S的非空子集。
通俗地说就是先把满足一个条件的都加上,这时候满足两个条件的被加了两次,所以要减掉一次,然后满足三个条件的被减成0次了,要加上一次…...
还有另一种形式。
记h(S)表示不满足集合S中所有条件的方案数。
g(S)=Σ(-1)^|T|*h(T),其中T为S的子集。
通俗地说就是先加上所有方案,然后扣掉不满足一个条件的方案,这时候不满足两个条件的被扣了两次,所以要加上一次,然后不满足三个条件的被加回1次了,所以要扣掉一次……

 应用:

1.对一个n*m的棋盘染色,每格可以是黑色或白色。
要求每行每列都有黑格。
求方案数对10^9+7取模的结果。
n,m<=10^3。

分析:套用上面的,题目要求的是满足“每行每列”,也就是相当于求g(S)嘛!"所有条件",也就是第二种容斥原理。既然要求不满足题意的行和列,即h(T),

枚举行数i,列数j,选出i行j列的方案数就是C(n,i) * C(m,j),那么我们怎么知道这i行j列全选白格的方案数呢?我们考虑没有被选上的n-i行,m-j列,这些行和列可以随意的选黑或者选白,也就是说方案数为2^(n-i)(m-j),根据容斥原理,答案为技术分享.

 

容斥原理