容斥原理

对于集合 S1,S2,,SnS_1, S_2, \ldots, S_n:

i=1nSi=iSii<jSiSj+i<j<kSiSjSk++(1)n1S1Sn\begin{aligned} \left|\bigcup_{i=1}^{n}S_i\right|=&\sum_{i}|S_i|-\sum_{i<j}|S_i\cap S_j|+\sum_{i<j<k}|S_i\cap S_j\cap S_k|+\cdots+(-1)^{n-1}|S_1\cap\cdots\cap S_n| \end{aligned}

也就是说,对于满足若干个性质中至少一个的元素,可以用同时满足若干个性质的元素个数进行容斥(满足一个的 - 满足两个的 + 满足三个的……)

如果对于上式稍加修改,我们也能得出集合交集的容斥公式:

i=1nSi=Ui=1nSi=UiSi+i<jSiSji<j<kSiSjSk++(1)nS1Sn\begin{aligned} \left|\bigcap_{i=1}^{n}S_i\right|=&|U|-\left|\bigcup_{i=1}^n\overline{S_i}\right|\\ =&|U|-\sum_{i}|\overline{S_i}|+\sum_{i<j}|\overline{S_i}\cap \overline{S_j}|-\sum_{i<j<k}|\overline{S_i}\cap \overline{S_j}\cap \overline{S_k}|+\cdots+(-1)^{n}|\overline{S_1}\cap\cdots\cap \overline{S_n}| \end{aligned}

也就是说,对于全部满足若干个性质的元素,可以用同时不满足若干个性质的元素个数进行容斥(所有 - 不满足一个的 + 不满足两个的 - 不满足三个的……)

二项式反演

形式

形式一

f(n)=i=0n(ni)g(i)    g(n)=i=0n(1)ni(ni)f(i)f(n) = \sum_{i=0}^n \dbinom n i g(i) \iff g(n)=\sum_{i=0}^n (-1)^{n-i} \dbinom n i f(i)

从组合意义上看,这个式子的含义可以理解为 f(n)f(n) 是从 nn 个元素中选出 ii 个满足条件的方案数,而 g(n)g(n) 是恰好有 nn 个满足的方案数。

形式二

f(n)=i=nm(in)g(i)    g(n)=i=nm(in)(1)inf(i)f(n) = \sum_{i=n}^m \dbinom i n g(i) \iff g(n)=\sum_{i=n}^m \dbinom i n (-1)^{i-n} f(i)

从组合意义上看,这个式子的含义可以理解为 f(n)f(n) 是钦定有 nn 个满足,其他随便的方案数,而 g(n)g(n) 是恰好有 nn 个满足的方案数。

例题

P4071 [SDOI2016] 排列计数

求长度为 nn,恰好有 mm 个位置满足 ai=ia_i=i 的排列个数。
多测,T5×105,n,m106T\le 5\times 10^5, n,m\le 10^6

考虑利用形式二进行二项式反演。

钦定有 kk 个位置满足 ai=ia_i=i 的排列个数 f(k)=(nk)(nk)!=n!k!f(k)=\dbinom n k (n-k)! = \dfrac{n!}{k!}
则要求的式子

g(m)=i=mn(im)(1)imf(i)=n!m!i=mn(1)im(im)!=n!m!i=0nm(1)ii!\begin{aligned} g(m) &= \sum_{i = m}^n \dbinom i m (-1)^{i-m} f(i) \\ &= \dfrac{n!}{m!}\sum_{i=m}^n \dfrac{(-1)^{i-m}}{(i-m)!}\\ &= \dfrac{n!}{m!}\sum_{i=0}^{n-m} \dfrac{(-1)^i}{i!} \end{aligned}

于是就做完了。

练习:https://atcoder.jp/contests/abc423/tasks/abc423_f

参考资料

https://oi-wiki.org/math/combinatorics/inclusion-exclusion-principle/
https://oi-wiki.org/math/combinatorics/combination/#二项式反演
https://www.cnblogs.com/Meatherm/p/16640448.html
https://www.cnblogs.com/YunQianQwQ/p/16712137.html