做题寄录
BS8240
对于一条边连向的两个点,我们只关心他们颜色相同与否。于是可以考虑把 \(n\) 个点分成若干集合,每个集合内部颜色相同,集合之间没有区别。不难发现这就是贝尔数的定义。
注意到 \(bell_{12} = 4213597\),于是当 \(n \leq 12\) 时直接搜索 \(n\) 个点的划分,再乘上 \(k^{\underline{cnt}}\) 即可。
再考虑一棵树的情况,容易设计 $dp_{x,i} $ 表示 \(x\) 颜色为 \(i\) 的总权值然后 \(O(nk)\) 转移,由于颜色之间没有区别,每个 \(i\) 的 \(dp_{x,i}\) 都是一样的,所以可以 \(O(n)\)。
于是就 70 了。
再考虑最后几个点,发现非树边最多只有 \(10\) 条,类似上面的思路,随便找一棵生成树后,对于每条非树边,直接搜索确定一点的颜色,此时设 \(dp_{x,i}\) 表示选择第 \(i\) 种颜色的方案(当 \(i = 0\) 时是未选择的 \(k - cnt\) 种颜色),最后把根据当前点的颜色选择,将其所对应的非树边答案累加。
于是复杂度就是 \(O(bell_{10}nk)\),因为 \(bell_{10}\) 是 1e5 级别,算出来只有 1e8,但会被卡常。
题解的一个解决方案是将 1 度点删去,2 度点将其贡献累加到所连向的两个点。这样每个点度数 \(\geq 3\),于是总点数减少,跑得飞快。
BS8241
建出括号树,对于一个询问 \(x, y(x<y)\) 而言,一定是不断跳,跳到其 lca 的两个儿子,要么直接从 lca 处转换括号,要么从同层括号之间单向移动。
于是只用预处理一个左 / 右括号到其父亲的 左 / 右括号的最小步数,显然可以在建树时用一个 \(2 \times 2\) 的矩阵表示转移。然后大力分讨就 over 了。
还有小清新的直接倍增写法,就是直接对每个点预处理跳 \(2^j\) 能到达的最左 / 最右点,一个跳 $2^j $ 的能到达的最左点要么是最靠左的 \(2^{j - 1}\),要么是最靠右的 \(2^{j - 1}\)。询问类似上面的做法,从两个点开始跳,一直跳到 lca 即可。
BS8236
硬核推柿子题。
首先考虑求出一个点的期望深度,设 \(d_x\) 表示 \(x\) 的期望深度,\(b_x\) 为 \(a_x\) 的前缀和,有转移 \(d_x =\dfrac{\sum\limits_{i = 1}^{x - 1}a_i(d_i+c_i+c_x)}{b_{x - 1}}\),可以通过分离变量做到 \(O(n)\)。
对于询问 \(x,y\),我们想要对于每个 \(l \in [1, x]\),计算出 \(l\) 为 \(x,y\) 的 \(\mathrm{lca}\) 的概率,答案就是 \(d_x+d_y -2\sum\limits_{l}P_ld_l\)。
假设 \(x<y\),直接枚举 \(x - y\) 的路径上经过的点集 \(S_{x,y}\),会发现其由两部分组成:在 \((l,x)\) 上的点可以在 \(l - x\) 的路径上,也可以在 \(l - y\) 上;对于 \((x,y)\) 的点,只能在 \(l - y\) 上,然后 开 幕 雷 击:
\(P_l =\dfrac{a_l^2}{b_{x - 1}b_{y - 1}} \sum\limits_{S_1 \subseteq (l, x)}\sum\limits_{S_2\subseteq (x,y)} \prod\limits_{i \in S_1}\dfrac{2a_i}{b_{i - 1}}\prod\limits_{i \in S_2} \dfrac{a_i}{b_{i - 1}}\)
解释一下:本质上就是一堆点,其 \(\dfrac{a_{p_{i - 1}}}{b_{p_i - 1}}\) 的乘积,只不过把 \(l, x, y\) 的贡献单独处理了,这个柿子在 \(x = l\) 时不成立,需要特殊处理。
然后将 \(\sum\limits_{S_1 \subseteq (l,x)}\prod ...\) 看成每个点选或不选:\(\prod\limits_{i = l+1}^{x - 1}(1+\dfrac{2a_i}{b_{i - 1}}) = \prod\limits_{i = l+1}^{x - 1}\dfrac{a_i+b_{i}}{b_{i-1}}\),右边 \(\prod\limits_{i = x+1}^{y - 1}\dfrac{b_i}{b_{i - 1}} = \dfrac{b_{y - 1}}{b_x}\)。
最后的答案就是 \(d_x+d_y - 2\sum\limits_{l = 1}^{x}d_l \times \dfrac{a_l^2}{b_xb_{x - 1}}\prod\limits_{i = l+1}^{x - 1}\dfrac{a_i+b_{i - 1}}{b_{i - 1}}\)。预处理 \(\dfrac{a_i+b_{i - 1}}{b_{i - 1}}\) 的前缀积即可。
BS8237
题意就是划分成两个公差相同的等差数列(可以有一个为空),直观感受一下,这个公差不会太大。
为了方便确定公差的范围,我们不妨将公差 \(d\) 的上界和下界写出来,并枚举首项 \(b\):
最少的操作次数 \(mn = \dfrac{\frac{n(n-1)}{2}d+bn - \sum a_i}{2}\),\(mx = \dfrac{a_{mx} \times n - \sum a_i}{2}+2n\),由于 \(mn \leq mx\),最后发现 \(nd \leq 1e6\)。
这意味着我们可以直接暴力枚举 \(d \in [-\dfrac{lim}n, \dfrac {lim}n]\),然后再花 \(O(n) - O(n \log n)\) 的时间得到让一段前缀 / 后缀变成公差为 \(d\) 的等差数列的答案,然后用 \(pre\) 和 \(suf\) 拼起来。
设 \(c_i = a_i - (i - 1) \times d\),那么对于一个首项 \(b\),对于 \(c_i - b \leq 0\) 的贡献而言,若 \(b - c_i\) 为偶数,就可以一直进行 +2 操作,次数就是 \(\dfrac{b - c_i}2\),否则需要加到 1 后减去 1,贡献就是 \(\dfrac{b+3 - c_i}{2}\);对于 \(c_i - b > 0\) 的贡献就是 \(c_i - b\)。
注意到这类似带权中位数问题,对于 \(c_i \leq b\),贡献可近似看做 \(\dfrac{b - c_i}2\),\(c_i > b\) 就是 \(c_i - b\)。根据数学??积累可知:\(b\) 取 \(c[n - \left\lceil \frac n 3\right\rceil+1]\) 取到,由于奇偶性的问题,还需要代入该值 -1 检验。
考虑动态维护这个过程,我们需要动态维护前 \(n - \left\lceil \frac n 3\right\rceil+1\) 的奇 / 偶个数以及和,后 \(\left\lceil \frac n 3\right\rceil\) 的个数以及和就可以 \(O(1)\) 计算答案了。
用对顶堆时刻维护该过程,时间复杂度 \(O(nd \log n)\)。
[JOI 2016 Final]断层
不看样例解释读不通题系列。
发现操作是向右上方移动和向左上方移动,由于正着做很难动态维护每个时刻的层数,考虑时光倒流。
倒流后,操作变成往左 / 右下移动,需要维护初始在 0 层的 \([i - 1, 0]\) 的当前层数,而且容易发现,设 \(x_i\) 表示当前 \([i - 1, i]\) 所在层数,则 \(x_i\) 单调不降,\(y_i\) 不会上升。
考虑一次左下方的移动对答案的影响:所有 \(x_i \leq x\) 的点 \((x,y)\) 变成 \((x - d, y -d)\)。而左下方就是 \((x+d, y - d)\)。将坐标轴变换 \((x, y) \to (\dfrac{x+y}2,\dfrac{x - y}2)\) 后,1 操作就是 \(y\) 的区间减, 2 操作是 \(x\) 的区间加。线段树二分即可。
CF1608F MEX counting
dp 状态很妙。
设 \(dp_{i, j,k}\) 表示当前考虑到前 \(i\) 位,当前 \(mex = k\),目前有 \(j\) 个 \(v > mex\) 的不同的值。
若不改变当前 mex,则有转移:
- \(dp_{i+1, j, k} \leftarrow dp_{i, j,k}\times k\),表示填入 \([0, k)\) 的值。
- \(dp_{i + 1, j, k} \leftarrow dp_{i, j, k} \times j\),表示填入 \(>k\) 的值,不新加个数。
- \(dp_{i+1, j + 1, k} \leftarrow dp_{i,j,k}\) 表示选择 \(a_i\) 为一个新出现的 \(> k\) 的值。
若改变,\(a_i\) 只能填 \(k\),枚举改变后的 \(mex = t\):\(dp_{i+1, j - (t - k - 1), t} \leftarrow dp_{i, j, k} \times \dbinom{j}{t - k - 1}(t - k - 1)!\)
直接做是 \(O(n^2k^2)\)。瓶颈在于第三种转移,换元 \(j \leftarrow j+k\) 然后将组合数拆开,利用前缀和即可 \(O(n^2k)\)。
P7468 [NOI Online 2021 提高组] 愤怒的小 N
一年半前...折戟沉沙...今天...30min内..我成功了,我不再是以前那个我了
先找数列通项。发现,后 \(2^{n - 1}\) 的数是由前 \(2^{n - 1}\) 的数在最高位加入 1 得到,而符号取反,于是就有 \(f(i) = \mathrm{popcount}(i) \bmod 2\),即 \(f(i) = \dfrac{1 - (-1)^{\mathrm{popcount}(i)}}{2}\)。
于是没有 ppc 的部分直接拉格朗日插出 \([0, n - 1]\) 的多项式前缀和即可,\(O(k^2)\)。
考虑后半部分,考虑枚举 \(n\) 的高位,设 \(f(x, c, k) = \sum\limits_{i = x}^{x+2^c - 1}(-1)^{\mathrm{popcount}(i)}i^k\),而 \(x\) 的最低位大于 \(c\),于是就有 \(f(x, c, k) = (-1)^{\mathrm{popcount}(x)}\sum\limits_{i = 0}^{2^c - 1}(-1)^{\mathrm{popcount(i)}})(i+x)^k = \sum\limits_{i = 0}^{2^c - 1}(-1)^{\mathrm{popcount(i)}}\sum\limits_{j = 0}^{k}\dbinom k jx^{k - j}i^j = (-1)^{\mathrm{popcount(x)}}\sum\limits_{j = 0}^{k}\dbinom{k}jx^{k - j}f(0, c, k)\)
只需要计算出 \(f(0,c,k)\) 即可。而 \(f(0, c, k)\) 也可以类似的方法做到 \(O(nk^2)\)。
然后通过打表发现 \(c > k\) 时 \(f(0, c, k) = 0\),于是需要计算的 \(f(0, c, k)\) 只有 \(O(k^3)\) 级别,容易记忆化搜索实现。
[AGC041F] Histogram Rooks
显然建出笛卡尔树后,钦定某些格子不填乘上 \((-1)^k\) 容斥。考虑如何设计 dp 状态。
因为一个钦定的位置,其列一定没有车,考虑设计 \(dp_{x,i}\) 表示在笛卡尔树上的 \(x\) 点,目前有 \(i\) 列存在钦定的格子。
那么转移就是简单把两个儿子合并起来,然后再考虑当前列的贡献。
设当前有 \(len\) 列,不选择钦定就是 \(2^{len - i}\),选择就是 \(\sum\limits_{j = 1}^{j}\dbinom i j(-1)^j = -[i \neq 0]\)。 对于每一行都做一次决策,就把其 \(k\) 次幂累加答案。
但这样做有一个问题,会存在有列被钦定,而这个钦定的列中并没有钦定的元素。于是再容斥,设 \(f_{x,i,j}\) 表示存在 \(j\) 个没有元素的列的方案,那么贡献就是 \(\sum\limits_{p = 1}^{i - j}\dbinom {i - j}p(-1)^p = -[i = j]\)
发现我们只关心 \(j\) 是否等于 \(i\),于是 j 那维只用开 0 / 1 即可。
CF1383E
操作相当于把两个相邻位置或起来,要想对合法串计数,首先考虑什么样的串是合法的:
- 首先是原串的一个子序列。
- 设 \(T_i\) 表示答案第 \(i - 1\) 个 1 和第 \(i\) 个 1 中间间隔的 0 的个数,\(S_i\) 表示原串的相邻 1 间隔的 0 的个数,设 \(|T| = k\),则存在 \(S\) 的一个子序列 \(p_1, p_2, \dots ,p_k\),满足 \(\forall i \in [1, k], s.t.S_{p_i} \geq T_i\)。因为总可以把相邻的 0 缩起来,相邻的 01 缩成 1。
考虑类似子序列自动机的 dp,设 \(dp_i\) 表示目前匹配到第 \(S_i\) 的方案,转移枚举当前填入的 \(v \leq S_i\),并在前面找到 \(j\) 满足 \((j, i)\) 中不存在 \(\geq v\) 的 \(S\),由于 \(\sum S_i = n\),直接暴力更新最靠右的决策点,然后直接前缀和优化。
CF1500C
首先将 \(A,B\) 每一行重标号,设 \(to_i\) 表示 \(A_i\) 对应 \(B_{to_i}\)(若存在相同的取前面的)。那么就要把 \(to_i\) 从小到大排序。
考虑所有元素的大小关系太麻烦,不妨只考虑相邻的元素,枚举排序的关键列 \(j\),对于相邻的两行 \(to_i, to_{i+1}\),若 \(a_{to_i, j} < a_{to_{i+1,j}}\),那么使用这种操作一定更优。若 \(a_{to_i, j} = a_{to_{i+1},j}\) 则无所谓;\(a_{to_i, j} > a_{to_{i+1},j}\) 则会使他们的相对顺序变化。
记录下对第 \(j\) 列的排序会影响到那些相邻行,若全是正序影响,显然排序更优。
否则,若存在反序影响,意味者该次操作后还会有另一个操作是对当前的正序影响。类似拓扑排序的依赖过程。
设 \(1 -m\) 表示排序第 \(i\) 列,\(m+1 - n +m\) 表示第 \(i\) 和第 \(i+1\) 行的点,于是若存在正序关系 ,连边 \(j \to m+i\),若存在反序关系,连边 \(m+i \to j\)。拓扑排序后,反向执行操作即可。
CF232C Doe Graphs
赛时无人通过的阴间分讨题。
图的大小为斐波那契数列,由于 \(fib_{78} > 10^{16}\),先把 \(n \leftarrow \min(n, 78)\)。
然后考虑求两个点 \(x,y\) 的最短路。设 \(f(n, x, y)\) 表示大小为 \(n\) 的图中 \(x,y\) 的最短路,不难发现有三种情况:
- \(x, y \leq fib_{n - 1}\),直接返回 \(f(n - 1, x,y)\)。
- \(x, y > fib_{n - 1}\),返回 \(f(n - 2, x - fib_{n - 1}, y - fib_{n - 1})\)。
- 否则,需要处理 \(x\) 在左侧,\(y\) 在右侧的答案。
发现源点 1 和终点 \(fib_n\) 很特殊。再考虑设 \(g(0 / 1, x, n)\) 表示大小为 \(n\) 的图中,\(x\) 到 \(1 / fib_n\) 的最短路,转移仍然分类讨论:
- \(x \leq fib_{n - 1}\),则 \(x \to 1\) 的最短路要么是 \(g(0, x, n - 1)\),要么是 \(g(1, x, n - 1)\),再走到 \(fib_{n - 1}+1\),再走到 1,\(x \to fib_{n}\) 的最短路可能是先走到 \(fib_{n - 1}\) 或 \(1\),再走到 \(fib_{n-1}+1\),最后走到 \(fib_n\),\(g(1, x, n - 1)+1+g(1, 1, n - 2)\)。
- \(x > fib_{n - 1}\),那么 \(x \to fib_n\) 的最短路是 \(g(1, x - fib_{n - 1}, n - 2)\),\(x \to 1\) 的最短路同样可以类似上面讨论得到。
但是有个问题,\(1 \to fib_n\) 的最短路可能从外面的点经过,若当前 \(n\) 不是最大的,那么可以从 \(1 \to fib_{n - 1} +1 \to fib_{n-1}\),然后记忆化一下就行了。
P8354 [SDOI/SXOI2022] 多边形
若 \(a_i = 1\) 显然是卡特兰数 \(Cat(n - 1)\),对于边上有点的情况,可以看作如下限制:
- 边上的点可以不连边。
- 不能在同一条边上连跨越一个点的边。
直接枚举有边连的点,设为 \(cnt\),则在 \(Cat(cnt - 1)\) 的所有不合法方案中一定存在边,使得其恰好跨过了一个被选择的点。
于是考虑对上面的非法情况容斥,先选择一个有边相连的集合 \(S\),再在集合内部钦定 \(k\) 对点被跨过,这 \(k\) 个点两两不相邻,把这些边缩起来。显然对于每条边都是独立的,只用把所有边的容斥系数 \(F_{a_i}\) 求出后全部卷起来后乘上卡特兰数即可。
而在大小为 \(t\) (不包含端点)的全集中选出 \(i\) 个点拼起来的方案为:\(f_i = \sum\limits_{j= 0}^{t - i}(-1)^j\dbinom{t}{i+j}\dbinom{i+1}j\)。
考虑如何在 \(O(\sum a_i)\) 的复杂度内求出这个东西,先做一些简单的变化:
\(f_i = [x^{t - i}]\sum\limits_{j = 0}^{t - i}(-x)^{j}\dbinom{i+1}{j}x^{t - i - j}\dbinom{t}{i+j} = [x^{t - i}](1 - x)^{i+1}(1+x)^t\)。
设 \(F_k = (1-x)^{k+1}(1+x)^t\)。然后考虑求导递推:\(F'_k = F_k\times (\dfrac{t}{1 - x} - \dfrac{k+1}{1+x})\),最后得到:\((n+1)g_{n+1} = (t - k - 1)g_n - (t+k - n +2)g_{n - 1}\)(\(< 0\) 的项定义为 0)
于是对于单个 \(f_i\) 可以递推求解,只需要保留最后两项然后根据递推式从后往前推。
考虑到 \(F_{k+1} = F_k(1 - x)\),因此 \(f_{k+1}\) 的项可以由当前保存的 \(w_{k+1}, w_{k+2}\) 得来。于是需要保存相邻的 3 个值,可以做到 \(O(\sum a)\) 计算。
AGC038F
显然,min - max 反演后,变成对于一个子集 \(T\),计算第一次有出现数 \(i\) 出现了 \(B_i\) 次的期望,转化为对每一个非终止状态计算其概率之和。
设 \(all = \sum\limits_{p \in S}a_p\),则期望为:\(\dfrac{S}{all}\prod\limits_{i\in S}\sum\limits_{c_i \leq a_i}\dfrac{(\frac{a_i}{all})^{c_i}}{c_i!}(\sum c_i)! = \dfrac{S}{all}\sum\limits_{c_i}\prod\limits \dfrac{a_i^{c_i}}{c_i!}all^{\sum c_i}\)
设 \(dp_{i, j, k}\) 表示考虑到前 \(i\) 个元素,目前 \(\sum a_i = j\),\(\sum c_i = k\) 的期望,转移显然。
CF1120D
将子树转化成区间,于是变成若干个区间 \([l_i, r_i]\),每个区间有代价 \(c_i\),求最少的代价可以使得每个 \([i,i]\) 可以通过若干个区间的异或得到。
将 \([l_i, r_i]\) 转化成 \(l_i\) 和 \(r_i+1\) 连边,于是就是最小生成树。
CF1225G
Observation1:若存在合法方案,当且仅当存在正整数序列 \(\{d_i\}\) 满足 \(1 = \sum\limits_{i = 1}^{n}a_ik^{-d_i}\)。 且满足 \(\max(d_i) = d_k\) 的 \(k\) 至少有 2 个。
证明:反证法,若最大值唯一,则 \(k^m = \sum\limits_{i = 1}^{n}a_ik^{m - d}\),两边同时对 \(k\) 取模得到:\(0 \equiv a_p(\bmod k)\),而题目保证 \(k \nmid a_i\),于是推出矛盾。
于是判断有无解就十分简单了,只需要类似 ARC107D 那样,设 \(dp_{S, i}\) 表示当前集合为 \(S\),操作后是否能得到 \(i\),每次要么全部数除以 \(k\),要么新加一个数。用 bitset 优化一下就是 \(O(\dfrac{2^nS}w)\)。
然后考虑构造方案,可以先逆向推得每个点的 \(d_i\),由于最大值至少有两个,每次把两个最大值合并即可。
ABC231G
将答案写成 EGF 后随便算一算就好了。
ABC242H
min - max 反演后直接设 \(dp_{i, j, k}\) 表示考虑到前 \(i\) 个位置的点集,目前总共有 \(j\) 个区间至少覆盖了其中一个,当前最靠右的位置是 \(k\) 的方案,转移显然。
ARC124F
设 camel 向下走了 \(x\),向右走了 \(u\);cat 向上走了 \(y\),向右走了 \(v\),题目要求即为当 \(x+y = n\) 时,\(u = v\) 的次数有且仅有一次。
由于只关心他们的相对距离,每次可以看作在网格图上,初始在 \((0, 0)\),每次向上 / 左 / 右走,要求在 \((n, 0)\) 的次数只有一次,最后走到 \((2n, 0)\) 的方案数,最后将答案乘上 \(\dbinom{2n}n\) 即可。
设 \(f_i\) 表示向左 / 右都走了 \(i\) 步时第一次到达 \((n, 0)\) 的方案,答案即是 \(\sum\limits_{i = 0}^{n}f_i f_{n - i}\)。
考虑求解 \(f_i\),容易想到容斥,设 \(g_i\) 表示最后到达 \((n, 0)\) 的方案,显然有 \(g_i =\dbinom {n+2i}{2i}\dbinom{2i}i\)。
发现 \(g\) 可以通过 \(f\) 在 \((n, 0)\) 来回走若干步得到:设 \(h_i = \dbinom{2i}i\),则有 \(G = FH\)。
要求 \(F^2 = \dfrac{G^2}{H^2}\)。而 \(H = \dfrac{1}{\sqrt{1 - 4x}}\),于是答案就是 \([x^n](1 - 4x)G^2\)。容易线性计算。
ABC238Ex
时光倒流,设 \(f_{l,r}\) / \(g_{l,r}\) 表示当前考虑到 \((l,r)\),其中 \(l, r\) 都被选择的方案数 / 权值和。
转移就枚举一个 \(p\),设左右长度分别是 \(k, len - k\),则方案数是 \(c_1 = [s_l = R]+[s_R = 'L'], c_2 = [s_l = R]k+[s_r = L](len -k)\),转移是简单的。
ARC134F
把排列拆成若干轮换,显然轮换之间互相独立,只需计算一个环的答案后 exp 即可。
Observation1:一个环的 up 个数等于以最小值断环成链后,所有极长连续段是奇数的个数。证明略。
于是一个极长连续段的生成函数就是 \(\sum\limits_i x^i[i \bmod 2 = 1]W\),由于要求极长,于是还需要容斥。
设 \(F = \sum\limits_{i}x^i[i \bmod 2 = 1]W,\dfrac{1}{1 -A} = F\),那么答案就是 \(\exp(\sum\limits_{i \geq 1}\dfrac{\hat{A}^i}{i}) = \dfrac{1}{1 - \hat{A}}\)。
AGC032F
对于每刀而言,把切的第一刀标记为红色,旋转 \(\dfrac{2\pi}{3}\) 后标记成蓝色,再旋转 \(\dfrac{2\pi}{3}\) 后标记成蓝色,那么答案就是异色线段之间的最短距离。
引理 1:在 \([0, 1)\) 之间随机选择 \(n - 1\) 个点分割成的 \(n\) 条线段当中,第 \(k\) 小的期望为 \(\dfrac{1}n(\sum\limits_{i = 1}^{k}\dfrac{1}{n - i+1})\)。
证明:当 \(k = 1\) 时,即是最短线段的期望,计算所有线段 \(\geq x\) 的概率,积分可得:
当 \(k > 1\) 时,采用归纳法证明即可。
只考虑 \([0, \dfrac{2\pi}3)\) 这一部分的贡献,因为剩下两部分是对称的。
由于异色线段最小值只有可能在相邻两个点之间取得,枚举异色线段为第 \(k\) 小,这要求前 \(k - 1\) 小的线段都是同色的,概率就是 \(\dfrac{3^{n - i+1} - 3^{n -i}[i \neq n]}{3^{n}} = 3^{-i +1} - 3^{-i}[i \neq n]\),因为 \(n\) 个线段不可能全部同色,于是答案就是:
\(ans = \dfrac{1}{3n}\sum\limits_{i = 1}^{n} (3^{-i+1} - 3^{-i})\sum\limits_{j = 1}^{i}\dfrac{1}{n - j+1} = \dfrac{1}{n}\sum\limits_{j = 1}^{n}\dfrac{1}{n - j+1}3^{-j}\)
ARC132F
由于 \(P\) 能战胜 \(R\),\(R\) 能战胜 \(S\),\(S\) 能战胜 \(P\),把 \(R\) 看作 1, \(S\) 看作 2,\(P\) 看作 3,将一个操作序列看作 4 进制下长度为 \(k\),的数,然后考虑如下的运算:
\(x \otimes y = \begin{cases} 0 \ \ \ x \neq y \\ x \ \ \ x = y\end{cases}\)
那么一个操作序列 \(S\) 的答案就是 \(A,B\) 做卷积后,至少有一位与 \(S\) 相同的个数,代表着存在一轮,\(A,B\) 出的都相同,而 \(C\) 恰好出了能获胜的哪一个。
根据 FWT 相关理论,可以构造出真值表为:
\(\begin{bmatrix} 1 \ \ 1 \ \ 1 \ \ 1 \\ 0 \ \ 1 \ \ 0 \ \ 0 \\ 0 \ \ 0 \ \ 1 \ \ 0\\ 0 \ \ 0 \ \ 0 \ \ 1\end{bmatrix}\),(其实就是把 0 看作 1, 2, 3 的子集,其中 1 2 3互不包含时的高位后缀和),显然其逆矩阵为:\(\begin{bmatrix} 1 ,-1,-1 , -1 \\ 0 \ \ \ \ 1 \ \ \ \ 0 \ \ \ \ 0 \\ 0 \ \ \ \ 0 \ \ \ \ 1 \ \ \ \ 0\\ 0 \ \ \ \ 0 \ \ \ \ 0 \ \ \ \ 1\end{bmatrix}\)
然后考虑求至少有一位与 \(S\) 相同的的方案,容易转化为计算每一位都与 \(S\) 不同的方案,显然也可以 FWT 计算。
ABC236H
显然是要对 \(A_i \neq A_j\) 容斥,考虑钦定 \(m\) 个相同的容斥系数是多少:直接给出答案是 \((-1)^{m - 1}(m - 1)!\)。
可以简单地利用斯特林反演,设 \(f_i\) 表示钦定选出大小为 \(i\) 的连通块的方案,\(g_i\) 表示恰好大小为 \(i\) 的方案,有:$f_i = \sum\limits_{n \geq i}\begin{Bmatrix} n \ i \end{Bmatrix}g_n \Rightarrow g_i = \sum\limits_{ n \geq i}(-1)^{n - i}\begin{bmatrix} n \ i \end{bmatrix} $,所求的即是 \(g_1\)。
也可以用子集容斥,考虑钦定边集 \(E\),根据 \(\sum\limits_{E}(-1)^{|E|}g(E)\),考虑边集 \(E\) 形成的连通块,若连通块大小不为 1,考虑连向两个连通块的某一条边 \(e\),包含 \(e\) 和不包含 \(e\) 的贡献 \(g(E)\) 相同,但符号相反。
于是只考虑形成一个连通块的情况,设 \(h_{n,i}\) 表示 \([1, i]\) 和 \([i+1, n]\) 都有连边的容斥系数,当 \(i \neq 1\) 时,考虑 \(1 - 2\) 的连边抵消,于是有 \(h_n = \sum\limits_{i = 1}^{n - 1}(-1)^{i - 1}\dbinom{n - 1}{i}h_{n - 1, i} = (-1)^{n - 1}(n-1)!\)。
LOJ#3399 2020-2021 集训队作业」Communication Network
类似 [WC2019 数树] 一样的做法,先用 prufer 序列的推论进行子集反演,再将柿子进行组合意义优化。
设 \(f(S)\) 表示与原树交恰好为 \(S\) 的方案,子集反演:\(f(S) = \sum\limits_{S \subseteq T}(-1)^{|T| -|S|}g(T)\),其中 \(g(T) = n^{n - |T| - 2}\times \prod\ a_i\)。
考虑其组合意义:枚举所有的原树边集合,每选出一条边贡献为 \((-\dfrac 1 n)\),边集的贡献为所有边的乘积,同时在边集形成的连通块中每个连通块选择一个点。再选出边集的一个子集 \(S\),选出一条边贡献为 \((-2)\),再在子集 \(S\) 里面选择一条边的方案。
对于每个连通块分开考虑,则一个连通块的贡献只和是否选点和边有关系,设 \(dp_{x, 0 / 1, 0 / 1}\) 表示 \(x\) 所在连通块,是否选点,是否选边。
转移:对于儿子 \(y\),若 \((x, y)\) 不选则 \(dp_{x, i, j | v} \leftarrow dp_{x,i, j} \times dp_{y, 1, v}\)。
若 \((x, y)\) 选,则考虑该边是否加入 \(S\),加入 \(S\) 后是否成为选择的那条边,有:
\(dp_{x, i | u, j|v} \leftarrow (-\dfrac 1 n )\times dp_{x, i, j} \times dp_{y, u, v}, dp_{x, i|u, j |v} \leftarrow (-\dfrac1 n)\times (-2)\times dp_{x, i, j} \times dp_{y, u,v} \ \ i+ u \neq2, j+v \neq 2\)。
\(dp_{x, i| u, 1} \leftarrow (-\dfrac 1 n)\times (-2) \times dp_{x, i, j}\times dp_{y,u, v} \ \ \ j = v = 0\)。
时间复杂度 \(O(n)\)。
P5807 Which Dreamed It /【模板】BEST 定理
BEST 定理用于解决有向欧拉图的欧拉路径计数问题。其形式为:
设 \(T_1\) 表示 1 为根的内向树个数,\(deg_x\) 表示 \(x\) 的出度(入度),则
\(ans = T_1\times \prod\limits_{i = 1}^{n}(deg_i - 1)!\)。
若规定 \(1\) 出发,则 \(ans = T_1 \times deg_1! \times \prod\limits_{i = 2}^{n}(deg_i - 1)!\)
[AGC051D] C4
枚举 1 号店出度 \(out_1\),可算出所有点的入度和出度,然后套用 BEST 定理。
[NOI2007] 生成树计数
笑话 1:用状压暴力枚举行列式的取值 \(O(2^{k+1} \times n)\) 有 80 分。
笑话 2:提示部分对正解没有任何帮助。(谁会老老实实化简矩阵啊
考虑每个点往前连只能连 \(k\) 个点,因此用最小表示法记录一下最后 \(k\) 个点的连通情况,每次向后转移一位时,要求第 \(k+1\) 个点必需至少和前 \(k\) 个点有连边,由第二类斯特林数可知总数不超过 \(55\),因此可以类比集合划分一样枚举每个点连通情况,\(n\) 个点连成树的方案为 \(n^{n - 2}\),用矩阵乘法优化。
[Code+#2]白金元首与独舞
将没有连向的点连向虚拟终点 \(s\),问题变成求 \(s\) 为根的内向树个数,若已经出现环则无解。直接高斯消元 \((nm)^3\) 显然不行,但由于我们只关心特殊点之间的连边情况,因此对每个点预处理出其向上下左右沿着 LRUD 到达的第一个特殊点,再连边,就是 \(O(k^3)\) 了。