容斥原理
对于集合 S1,S2,…,Sn:
i=1⋃nSi=i∑∣Si∣−i<j∑∣Si∩Sj∣+i<j<k∑∣Si∩Sj∩Sk∣+⋯+(−1)n−1∣S1∩⋯∩Sn∣
也就是说,对于满足若干个性质中至少一个的元素,可以用同时满足若干个性质的元素个数进行容斥(满足一个的 - 满足两个的 + 满足三个的……)
如果对于上式稍加修改,我们也能得出集合交集的容斥公式:
i=1⋂nSi==∣U∣−i=1⋃nSi∣U∣−i∑∣Si∣+i<j∑∣Si∩Sj∣−i<j<k∑∣Si∩Sj∩Sk∣+⋯+(−1)n∣S1∩⋯∩Sn∣
也就是说,对于全部满足若干个性质的元素,可以用同时不满足若干个性质的元素个数进行容斥(所有 - 不满足一个的 + 不满足两个的 - 不满足三个的……)
二项式反演
形式
形式一
f(n)=i=0∑n(in)g(i)⟺g(n)=i=0∑n(−1)n−i(in)f(i)
从组合意义上看,这个式子的含义可以理解为 f(n) 是从 n 个元素中选出 i 个满足条件的方案数,而 g(n) 是恰好有 n 个满足的方案数。
形式二
f(n)=i=n∑m(ni)g(i)⟺g(n)=i=n∑m(ni)(−1)i−nf(i)
从组合意义上看,这个式子的含义可以理解为 f(n) 是钦定有 n 个满足,其他随便的方案数,而 g(n) 是恰好有 n 个满足的方案数。
例题
求长度为 n,恰好有 m 个位置满足 ai=i 的排列个数。
多测,T≤5×105,n,m≤106。
考虑利用形式二进行二项式反演。
钦定有 k 个位置满足 ai=i 的排列个数 f(k)=(kn)(n−k)!=k!n!。
则要求的式子
g(m)=i=m∑n(mi)(−1)i−mf(i)=m!n!i=m∑n(i−m)!(−1)i−m=m!n!i=0∑n−mi!(−1)i
于是就做完了。
练习: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