容斥学习笔记

容斥


错排问题

\(n\)个人要站队,每个人有编号,第\(i\)个人不能站在第\(i\)个位置,求方案数。

\(n \leqslant 1e5\)


\(g[i]\)表示至少\(i\)个人站对了的方案数,剩下的人乱站,那么很显然可以得到
\[ g[i]=(n-i)! \]
\(f[i]\)表示恰好\(i\)个人站对了的方案数,然后根据容斥乱猜以及理(bu)性(xiang)分(zheng)析(ming),可以得到:
\[ f[n]=\sum_{i=0}^n(-1)^i\binom{n}{i}g[i] \]
然后分析下为什么是对的。

考虑任意一种有\(m\)个人站对了的方案,可以发现,在算至少0个到至少\(m-1\)个时,这一种方案会被算到这么多次:
\[ \begin{align} &~~~~\sum_{i=0}^{m-1}(-1)^i\binom{m}{i}\\ &=\sum_{i=0}^{m}(-1)^i\binom{m}{i}-(-1)^m\\ &=(1+(-1))^m-(-1)^m\\ &=-(-1)^m \end {align} \]
既然多算了这么多次,就把他减掉,所以是正确的。


对于上面的式子,有一个特例,即:
\[ \sum_{i=0}^{n}(-1)^i\binom{n}{i}=[n=0] \]
即当n不为0时,上面的式子才为0 。


现在考虑下为什么是这样的。

首先有一个很显然的式子:
\[ g[n]=\sum_{i=0}^n\binom{n}{i}f[i] \]
但是我们现在只知道算\(g\),而不会算\(f\)

先说句废话:
\[ f[n]=\sum_{i=0}^n[n-i=0]\binom{n}{i}f[i] \]
然后可以发现这个式子中间的部分和上面的式子有点像,带进去试试。
\[ f[n]=\sum_{i=0}^{n}\sum_{j=0}^{n-i}(-1)^j\binom{n-i}{j}\binom{n}{i}f[i] \]
然后魔术开始:

对于\(\binom{n-i}{j}\binom{n}{i}\),其实就是从\(n\)个里选出\(i\)个,在选出\(j\)个的方案数,所以可以调换下顺序,等价于\(\binom{n-j}{i}\binom{n}{j}\)

所以原式就会等于
\[ f[n]=\sum_{i=0}^{n}\sum_{j=0}^{n-i}(-1)^j\binom{n-j}{i}\binom{n}{j}f[i] \]
调换下枚举顺序
\[ f[n]=\sum_{j=0}^n(-1)^j\binom{n}{j}\sum_{i=0}^{n-j}\binom{n-j}{i}f[i] \]
注意下后面那个玩意,发现这个和\(g\)有点像
\[ \begin{align} f[n]&=\sum_{j=0}^n(-1)^j\binom{n}{j}g[n-j]\\ &=\sum_{j=0}^n(-1)^j\binom{n}{n-j}g[n-j]\\ &=\sum_{i=0}^n(-1)^i\binom{n}{i}g[n] \end{align} \]
这就是一开始的那个式子。


总结

对于一个问题,如果有N个约束条件,求满足0个条件的方案数,

扫描二维码关注公众号,回复: 4259090 查看本文章

\(f[i]\)为恰好有i个约束条件满足,\(g[i]\)为至少有i个条件被满足,

显然有
\[ g[n]=\sum_{i=0}^n\binom{n}{i}f[i] \]
然后可以得到
\[ f[n]=\sum_{i=0}^n(-1)^i\binom{n}{i}g[i] \]
这就是容斥原理,也叫二项式反演。

猜你喜欢

转载自www.cnblogs.com/hbyer/p/10026456.html