容斥学习笔记

容斥

基本公式
\(|\bigcup\limits_{i=1}^na_i|=\sum\limits_{T\subseteq[1,n]}-1^{|T|+1}|\bigcap\limits_{i\in T}a_i|\)

min-max容斥

\(\max_{i\in S}a_i=\sum\limits_{T\subseteq S}(-1)^{|T|+1}\min_{i\in T}a_i\)

\(\min_{i\in S}a_i=\sum\limits_{T\subseteq S}(-1)^{|T|+1}\max_{i\in T}a_i\)

二项式反演

二项式反演用于解决“某种物品恰好若干个”这类的问题,与容斥原理类似。

一般形式:若\(g_n=\sum\limits_{i=0}^n\dbinom{n}{i}f_i\),那么有\(f_n=\sum\limits_{i=0}^n\dbinom{n}{i}(-1)^{n-i}g_i\)

证明:将\(g_i\)展开,得

\[\begin{aligned} f_n&=\sum\limits_{i=0}^n\dbinom{n}{i}(-1)^{n-i}\sum\limits_{j=0}^i\dbinom{i}{j}f_j\\ &=\sum\limits_{j=0}^nf_j\sum\limits_{i=j}^n\dbinom{n}{i}\dbinom{i}{j}(-1)^{n-i}\\ &=\sum\limits_{j=0}^nf_j\sum\limits_{i=j}^n\dbinom{n}{j}\dbinom{n-j}{i-j}(-1)^{n-i}\\ &=\sum\limits_{j=0}^nf_j\dbinom{n}{j}\sum\limits_{k=0}^{n-j}\dbinom{n-j}{k}(-1)^{n-j-k}\\ &=\sum\limits_{j=0}^nf_j\dbinom{n}{j}\sum\limits_{k=0}^{n-j}\dbinom{n-j}{k}(-1)^{n-j-k}1^k &=\sum\limits_{j=0}^nf_j\dbinom{n}{j}(-1+1)^{n-j}\\ &=\sum\limits_{j=0}^nf_j\dbinom{n}{j}[n-j==0]\\ &=f_n \end{aligned}\]

一般的二项式反演形式有两种,一是\(g_n\)表示至多\(n\)个的方案数,\(f_n\)表示恰好\(n\)个的方案数,那么有

\[g_n=\sum\limits_{i=0}^n\dbinom{n}{i}f_i\iff f_n=\sum\limits_{i=0}^n\dbinom{n}{i}(-1)^{n-i}g_i \]

二是\(g_n\)表示至少\(n\)个的方案数,\(f_n\)表示恰好\(n\)个方案数,那么有

\[g_j=\sum\limits_{i=j}^n\dbinom{i}{j}f_i\iff f_j=\sum\limits_{i=j}^n(-1)^{i-j}\dbinom{i}{j}g_i \]

1.P8329 [ZJOI2022] 树

题意:定义两颗树是好的当且仅当第1棵树每个点父亲编号小于它,第2棵树每个点父亲编号大于它,每个点恰好在一棵树上是叶子,求对1~\(n\) 求方案数。

思路:(不会容斥,好似) 首先考虑设 \(f(S)\) 表示第 1 棵树非叶集合为 \(S\) 的方案数,第二棵树为 \(g(S)\),那么很容易推出

\[ans=\sum\limits_{S\cap T=\varnothing,S\cup T=\{1,2,\cdots n\}}f(S)g(T) \]

但是 \(f(S)\)\(g(S)\) 并不方便直接求,我们考虑容斥。设 \(f'(S)\) 表示第一棵树非叶集合 \(\subseteq S\) 的方案数,\(g'(S)\) 同理,那么可知

\[\begin{aligned}ans&=\sum\limits_{S\cap T=\varnothing,S\cup T=\{1,2,\cdots n\}}f(S)g(T)\\&=\sum\limits_{S\cap T=\varnothing,S\cup T=\{1,2,\cdots n\}}\sum\limits_{S'\subseteq S,T'\subseteq T}f'(S')g'(T')(-1)^{|S|-|S'|+|T|-|T'|}\\&=\sum\limits_{S'\cap T'=\varnothing}f'(S')g'(T')(-1)^{n-|S'|-|T'|}2^{n-|S'|-|T'|}\\&=\sum\limits_{S'\cap T'=\varnothing}f'(S')g'(T')(-2)^{n-|S'|-|T'|}\end{aligned} \]

这样似乎比之前的恰好更好处理一些。于是我们设 \(dp[i][j][k]\) 表示 \(|\{1,2,\cdots i\}\cap S'|=j,|\{i+1,i+2,\cdots n\}\cap T'|=k\) 的方案数。转移时根据 \(i\) 是属于 \(S'\) 还是 \(T'\) 还是都不属于进行分类讨论即可。

复杂度 \(O(n^3)\)

2.P2332 [SCOI2006] 数字立方体

题意:有多少子立方体的和是 \(m\) 的倍数。

思路:算是神秘优化。

朴素的做法是 \(O(n^6)\) 的,要枚举两个坐标,考虑怎么优化。

如果确定了两维,那么就可以用桶记录下确定这两维后的所有和,此时满足条件的个数就是相同的和的个数的平方和,可以 \(O(n)\) 统计,于是复杂度就是 \(O(n^5)\)

3.P8292 [省选联考 2022] 卡牌

题意:小 A 有 \(n\) 张卡牌,编号为 \(1, 2, \ldots, n\)。每张卡牌上写着一个正整数,第 \(i\) 张卡牌上的正整数为 \(s_i\)

现在有 \(m\) 轮游戏,第 \(i\) 轮游戏会给出 \(c_i\) 个质数,小 A 需要选择任意多张卡牌,使得这些卡牌上面的正整数的乘积能被该轮游戏给出的每个质数整除。求有多少种方案。

思路:首先,可以想到用所有答案减去不合法的答案,不合法的方案也可以再容斥,就是不含某一个质数的方案数减去不含两个质数的方案数,依次类推。于是就有暴力枚举质因数的做法。

但是质因数还是很多,不能直接状压,这就让我们想到了 [NOI2015] 寿司晚宴,这题的做法是根分,小于根号部分的质数很少,可以状压,而且最多只有一个大于根号的质因子。

这题同样可以根分。小于根号部分的质因子只有 13 个,大于的部分,可以单独考虑,即如果这个质数被给出,那么方案数就是 \(2^{cnt[i]}-1\),否则就是 \(2^{cnt[i]}\)。小于的部分,我们可以暴力容斥,求出每个不含质因子的集合的答案,乘上容斥系数再求和即可。

posted @ 2024-02-15 15:46  Xttttr  阅读(16)  评论(0编辑  收藏  举报