容斥
二项式反演
也就是 \(f(x) = g(x + 1) \Leftrightarrow g(x) = f(x - 1)\) (好像没什么东西 = =)
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 容斥
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}\)。这样空间爆炸,要把第一维压掉。
单位根反演
证明(循环卷积的) \(\texttt{IDFT}\) 正确性:
证明
如果我们要计算 $H(x) = F(x) G(x)$让 \(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
子集反演
普通容斥
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)\) 的方案数。
对于每一条直线,我们把终点绕着他翻转就是必定经过他的方案数。
于是可以递归(只有经过第一条线,再经过第二条线,再经过第一条线...的会被计算到) 处理来计算答案。