Loading

容斥

二项式反演

\[f_x=\sum\limits_{i=0}^x C_x^i g_i\Leftrightarrow g_x=\sum\limits_{i=0}^x (-1)^{x-i} C_x^i f_i \]

也就是 \(f(x) = g(x + 1) \Leftrightarrow g(x) = f(x - 1)\) (好像没什么东西 = =)

\[f_x=\sum\limits_{i=x}^n C_i^x g_i\Leftrightarrow g_x=\sum\limits_{i=x}^n (-1)^{i-x} C_i^x f_i \]

CF1342E Placing Rooks
\(k > n\) 显然答案为 \(0\), \(k=0\) 答案就是 \(n!\)
否则一定是每一行有一个棋子 / 每一列有一个棋子。(每一列有一个棋子的方案数 * 2)
然后二项式反演,\(f(x)\) 表示互相攻击到的车大于 \(x\) 种的方案数, \(g(x)\) 表示互相攻击到的车等于 \(x\) 种的方案数。
\(f(x)=\sum\limits_{i=x}^n C_i^x g(i)\Leftrightarrow g(x)=\sum\limits_{i=x}^n (-1)^{i-x} C_i^x f(i)\)
然后考虑算 \(f(x)\) 。就是算 \(n\) 个棋子只能投在 \(n-k\) 列内,答案为 \((n-k)^n C_{n}^k\)

P6478 [NOI Online #2 提高组]游戏
\(f_x\) 表示非平局回合数为 \(x\) 的方案数,\(g_x\) 表示钦定非平局回合数为 \(x\) 的方案数。
\(g(x)=\sum\limits_{i=x}^n C_i^x f(i)\Leftrightarrow f(x)=\sum\limits_{i=x}^n (-1)^{i-x} C_i^x g(i)\)
然后 \(g\) 是树形 \(dp\) 算一下就好了

【ULR #1】多线程计算
考虑一个暴力做法,就是枚举亮的顺序,然后每一个亮的时间期望为 \(\frac{1}{nm + 1}\)。考虑优化。
\(f_{i, j}\) 为钦定 \(i\) 行,\(j\) 列亮的方案数,\(g_{i, j}\) 为恰好 \(i\) 行,\(J\) 列亮的方案数。
那么二项式反演, \(f_{i, j} = \sum\limits_{a = i}^{n} \sum\limits_{b = j}^{m} C_{a}^{i} C_{b}^{j} g_{i, j} \Leftrightarrow g_{i, j} = \sum\limits_{a = i}^{n} \sum\limits_{b = j}^{m} (-1)^{a - i} (-1)^{b - j} C_{a}^{i} C_{b}^{j} f_{i, j}\)
\(g_{i, j}\) 怎么算?枚举除了这 \(i\)\(j\) 列还有几个量的,就是 \(\sum\limits_{t = 0}^{(n-i)(n - j)} C_{(n-i)(n-j)}^{t} F_{t + nm - (n-i)(n-j)}\)。这个可以卷积优化。上面那个也可以 \(2DFFT\) 优化。

P5400 [CTS2019]随机立方体
二项式反演的部分比较套路,但是后面的部分比较难想。 推导

Min-Max 容斥

\[Max(S)=\sum\limits_{T\subseteq S} (-1)^{|T|-1} min(T) \]

\[Min(S)=\sum\limits_{T\subseteq S} (-1)^{|T|-1} max(T) \]

\[KthMax(S)=\sum\limits_{T\subseteq S} (-1)^{|T|-k}C(|T|−1,k−1) min(T) \]

\[E(max(S))=\sum\limits_{T\subseteq S} (-1)^{|T|-1} E(min(T)) \]


P3175 [HAOI2015]按位或
\(E(max(S))\)\(S\) 出现最晚的一位,\(E(min(S))\)\(S\) 出现最早的一位,\(S'\)\(S\) 的补集。
\(E(max(S))=\sum\limits_{T\subseteq S} (-1)^{|T|-1} E(min(T))\)
考虑求 \(E(min(S))\)\(E(min(S))=\dfrac{1}{\sum\limits_{T \cup S \ne \emptyset} p_{T}} = \dfrac{1}{1-\sum\limits_{T \subseteq S'} p_{T}}\)
后面那个 FWT 求即可。

P5643 [PKUWC2018]随机游走
\(E(max(S))\)\(S\) 出现最晚的一个点,\(E(min(S))\)\(S\) 出现最早的一个点。
\(E(max(S))=\sum\limits_{T\subseteq S} (-1)^{|T|-1} E(min(T))\)
为了求 \(E(min(T))\), 然后可以用树形 \(dp\), 令 \(f_i\) 为从 \(i\) 节点到 \(S\) 上的节点的期望用时,然后可以进行推导
最后为了得出对于任意 \(E(max(S))\) 的答案,用 \(FWT\) 求出即可。

P4707 重返现世
首先我们让题目求的第 \(k\) 小变成第 \(n-k+1\) 大。
\(E(KthMax(S))=\sum\limits_{T\subseteq S} (-1)^{|T|-k}C(|T|−1,k−1) E(min(T))\)
\(dp_{i,j,d}\) 表示现在算第 \(i\) 个原料,现在的 \(\sum p_i=j\)\(k=d\) 时的 \(\sum\limits_{T\subseteq S} (-1)^{|T|-k}C(|T|−1,k−1)\)
转移就是考虑公式 \(C_{n}^{m}=C_{n-1}^m+C_{n-1}^{m-1}\) ,由于还要乘上 \((-1)^{|T|-k}\), 所以\(dp_{i,j,d}=dp_{i-1,j-a_i,d-1}-dp_{i-1,j-a_i,d}\)
然后答案就是 \(\sum\limits_{i=1}^{m} \frac{m}{i} dp_{n,i,k}\)。这样空间爆炸,要把第一维压掉。

单位根反演

\[[n|a]=\frac{1}{n} \sum\limits_{i=0}^{n-1} \omega_{n}^{a i} \]

证明(循环卷积的) \(\texttt{IDFT}\) 正确性:

证明 如果我们要计算 $H(x) = F(x) G(x)$

\[H_k = \sum\limits_{i = 0}^{n - 1} \sum\limits_{j = 0}^{n - 1} [(i + j) \bmod n = k] F_i G_j \]

\[H_k = \sum\limits_{i = 0}^{n - 1} \sum\limits_{j = 0}^{n - 1} \sum\limits_{t = 0}^{k - 1} \omega_{n}^{(i + j - k) t} F_i G_j \]

\[H_k = \sum\limits_{i = 0}^{n - 1} \sum\limits_{j = 0}^{n - 1} \sum\limits_{t = 0}^{k - 1} \omega_{n}^{(i + j - k) t} F_i G_j \]

\[H_k = \sum\limits_{t = 0}^{k - 1} \omega_{n}^{-kt} (\sum\limits_{i = 0}^{n - 1} F_i \omega_{n}^{it}) (\sum\limits_{j = 0}^{n - 1} G_j \omega_{n}^{j t}) \]

\[H_k = \sum\limits_{t = 0}^{k - 1} \omega_{n}^{-kt} F(\omega_{n}^t) G(\omega_{n}^t) \]

\(P(x) = \sum\limits_{t = 0}^{k - 1} F(\omega_{n}^t) G(\omega_{n}^t) x^{t}\)

也就是说 \(H_k = P(\omega_{n}^{- k})\)这就证明完了???

P5591 小猪佩奇学数学
较为基础。推导 link

子集反演

\[f(S) = \sum\limits_{T \subseteq S} g(T) \Leftrightarrow g(S) = \sum\limits_{T \subseteq S} (-1)^{S - T} f(T) \]

P7275 计树
感觉这个东西用子集反演去算比较巧妙吧。 link

普通容斥

CF348D Turtles
这题十分巧妙。\(ans = [(1, 2) to (n, m- 1)] \times [(2, 1) to (n - 1, m)] - [(1, 2) to (n - 1, m)] \times [(2, 1) to (n, m- 1)]\)

P3266 [JLOI2015]骗我呢
高妙的容斥。对列的编号进行差分(顺便把图给翻一下),\(a_{x, y} \in \{0, 1\}\)\(a_{x, y} \ge a_{x, y - 1}, a_{x, y} \ge a_{x - 1, y - 1}\)。然后再做一个对于行的平移,问题转化为了一个路经数量的问题:
\((0, 0)\)\((n + m + 1, n)\) 的路径上不经过直线 \(y = x + 1\)\(y = x - (m + 2)\) 的方案数。
对于每一条直线,我们把终点绕着他翻转就是必定经过他的方案数。
于是可以递归(只有经过第一条线,再经过第二条线,再经过第一条线...的会被计算到) 处理来计算答案。

posted @ 2020-10-07 18:32  zhoukangyang  阅读(15)  评论(0编辑  收藏  举报