2023.01.01 组合计数、概率与期望 学习笔记
讲课人:许庭强。
大概总体会比数据结构良心一些?可能可以归结为 AT 场。
但是不得不说很多题思维难度还是很高的。
1.AT_agc060_c [AGC060C] Large Heap
先考虑个问题:对于一棵 \(n\) 个点的有根树,如果要填上一个 \(1\sim n\) 的排列,且每个点填的数要比其所有儿子的都小,那么方案数是多少?
设 \(f_i\) 表示 \(i\) 节点的子树填一个 \(1\sim siz_i\) 的排列,且每个点填的数要比其所有儿子的都小的方案数,\(i\) 的所有儿子为 \(son_1\sim son_k\),那么 $$f_i=\binom{siz_i-1}{siz_{son_1},\cdots,siz_{son_k}}\prod_{j=1}^k f_{son_j}=(siz_i-1)!\prod_{j=1}^k\frac{f_{son_j}}{siz_{son_j}!}$$
即 $$\frac{f_{son_i}}{siz_{son_i}!}=\frac{1}{siz_i}\prod_{j=1}^k\frac{f_{son_j}}{siz_{son_j}!}$$
于是 $$f_{root}=siz_{root}!\prod_{i=1}^n \frac{1}{siz_i}=n!\prod_{i=1}^n\frac{1}{siz_i}$$
回到原问题,首先设根为第 \(0\) 层,那么 \(U\) 即根一直向左儿子走 \(A\) 步,\(V\) 即根一直向右儿子走 \(B\) 步。把根到 \(U\) 路径上的点(不含根)都标记为 \(1\),根到 \(V\) 路径上的点(不含根)都标记为 \(2\),那么我们把标 \(1\) 的点形成的链和标 \(2\) 的点形成的链归并起来,如下图,现在要求的变成了有多少种归并方式使归并后最下面的点是 \(1/2\)。
而根据前面的问题这等价于求 \(n!\) 乘上所有子树 \(siz\) 的倒数,而 \(n!\) 和没被标号的点的 \(siz\) 的倒数之积都是定值,会改变的只有被标号 \(1/2\) 的点的 \(siz\) 的倒数。于是设 \(f_{i,j}\) 表示目前归并的链中有 \(i\) 个点标号为 \(1\),\(j\) 个点标号为 \(2\),每种方案 \(siz\) 的倒数之积的和,转移枚举下一个点的标号 \(O(1)\) 转移。预处理逆元后总时间复杂度 \(O(n^2)\),空间复杂度 \(O(n^2)\)。
2.AT_agc060_d [AGC060D] Same Descent Set
对于一个排列 \(P\) 的相邻两个数的大小关系共有 \(n-1\) 对,每对大小关系可以看成在这两个数之间的位置填 <
或 >
。于是答案可以被表示为 \(\sum_{S}(P\) 中的 >
集合 \(=S\) 的排列数 \()^2\),记 \(f(T)\) 表示 \(P\) 中的 >
集合 \(\supseteq T\) 的排列数,把括号里的东西容斥,得到 \(\sum_{S}(\sum_{T,S\subseteq T}(-1)^{|T|-|S|}f(T))^2\),把平方拆开得 \(\sum_{S}\sum_{T_1,T_2,S\subseteq T_1,S\subseteq T_2}(-1)^{|T_1|+|T_2|}f(T_1)f(T_2)\),先枚举 \(T_1,T_2\),这样符合条件的 \(S\) 的个数可以直接计算,即 \(\sum_{T_1,T_2}(-1)^{|T_1|+|T_2|}f(T_1)f(T_2)2^{|T_1\cap T_2|}\),由于容斥了如果一个位置被钦定填 >
了我们把它看作 \(1\),如果一个位置没被钦定填 >
(即没有限制)我们把它看作 \(0\),设 \(k\) 表示 \(T_1,T_2\) 均为 \(0\) 的位数,那么 \(|T_1\cap T_2|=|T_1|+|T_2|-|T_1\cup T_2|=|T_1|+|T_2|-(n-1-k)\),于是原式被化简为 \(\sum_{T_1,T_2}(-1)^{|T_1|+|T_2|}f(T_1)f(T_2)2^{|T_1|+|T_2|-(n-1-k)}=2^{-n+1}\sum_{T_1,T_2}(-2)^{|T_1|}f(T_1)(-2)^{|T_2|}f(T_2)2^{k}\)。
假设 \(f(T)\) 中没有钦定填 >
的位置(即 \(0\) 的位置)把序列分成了 \(t\) 段,第 \(i\) 段长 \(l_i\),每段内相邻两个数由一个 >
连接,那么符合条件的排列数共有 \(\binom{n}{l_1,l_2,\cdots,l_t}=\frac{n!}{\prod_{i=1}^t l_i!}\) 种。考虑设生成函数 \(F(x),F'(x),G(x)\),其中 \([x^n]F(x)\) 表示 \(\sum_{T_1,T_2,T_1\subseteq 2^{n-1}-1,T_2\subseteq 2^{n-1}-1}(-2)^{|T_1|}f(T_1)(-2)^{|T_2|}f(T_2)=(\sum_{T,T\subseteq 2^{n-1}-1}(-2)^{|T|}f(T))^2\),\([x^n]F'(x)=\frac{\sum_{T,T\subseteq 2^{n-1}-1}(-2)^{|T|}f(T)}{n!}\),\([x^n]G(x)=\frac{(-2)^{n-1}}{n!}\)(你也可以认为 \(F',G\) 都是指数型生成函数),那么 \(F'=1+G+G^2+\cdots=\frac{1}{1-G}\),求得 \(F'\) 后可以还原出 \(F\)。现在考虑知道 \(F\) 后答案怎么求,设生成函数 \(H(x)\),其中 \([x^n]H(x)=\sum_{T_1,T_2}(-2)^{|T_1|}f(T_1)(-2)^{|T_2|}f(T_2)2^{k}\)(\(k\) 表示 \(T_1,T_2\) 均为 \(0\) 的位数),那么 \(T_1,T_2\) 均为 \(0\) 的位置把两个序列分成了 \(k+1\) 段,对于一个被分成的长为 \(l\) 的段其贡献为 \([x^l]F(x)\),设每段分别长 \(l_1,l_2,\cdots,l_{k+1}\),那么对 \(H\) 的贡献为 \(2^k\prod_{i=1}^{k+1}[x^{l_i}]F(x)=\frac{1}{2}\prod_{i=1}^{k+1}[x^{l_i}]2F(x)\),于是 \(H=\frac{1}{2}(1+2F+(2F)^2+\cdots)=\frac{1}{2}(\frac{1}{1-2F})\),答案为 \(2^{-n+1}[x^n]H(x)\)。
时间复杂度为多项式求逆的复杂度,即 \(O(n\log n)\),空间复杂度 \(O(n)\)。
3.AT_agc059_c [AGC059C] Guessing Permutation for as Long as Possible
首先,如果不用询问 \((A,B)\),不妨设 \(A<B\),说明此前已经有 \(C_1,\cdots,C_k\) 使得 \(A<C_1<\cdots<C_k<B\),找到最小的 \(k\),如果此时 \(k>1\),那么考虑 \((A,C_2)\) 是什么时候的询问。如果 \((A,C_2)\) 在 \((A,C_1)\) 和 \((C_1,C_2)\) 两者之后,那么 \((A,C_2)\) 也不用询问且此时 \(k'=1\);否则,\((A,C_2)\) 在 \((A,C_1)\) 和 \((C_1,C_2)\) 其中至少一者之前,那么用 \(C_2,\cdots,C_k\) 就可以使得 \((A,B)\) 不被询问,此时 \(k'=k-1\)。两种可能的情况都与 \(k\) 最小矛盾,说明 \(k=1\),也就是说如果一个排列不满足条件,那么一定存在 \(A,B,C\) 使得询问顺序是 \((A,C),(B,C),(A,B)\) 且 \(A<C<B\) 或 \(A>C>B\)。
枚举每一个无序三元组 \((A,B,C)\),设其询问顺序为 \((A,C),(B,C),(A,B)\),那么满足条件的排列一定满足 \(C\) 是三者中最小的或最大的。亦即 \(A<C\) 等价于 \(B<C\),\(A>C\) 等价于 \(B>C\)。那么我们对 \(n\) 个数两两之间的 \(n(n-1)\) 种大小关系都建一个点,并把等价的点用并查集连起来,如果存在 \(A,B\) 使得 \(A<B\) 和 \(A>B\) 在同一连通块,那答案为 \(0\)。否则,对于所有 \(A,B\) 都有 \(A<B\) 和 \(A>B\) 不在同一连通块,那么可以将连通块两两配对(\(A<B\) 所在连通块和 \(A>B\) 所在连通块配对),设连通块数为 \(m\)(可以发现一定是偶数),那答案即为 \(2^{\frac{m}{2}}\)。
时间复杂度 \(O(n^3)\),空间复杂度 \(O(n^2)\)。
4.AT_agc058_d [AGC058D] Yet Another ABC String
没讲。
5.AT_agc054_c [AGC054C] Roughly Sorted
如果给你一个排列 \(p\),那么最少要交换几次使得对于任意 \(1\le i\le n\),\(1\le j\lt i\) 且 \(p_j>p_i\) 的 \(j\) 的数量都不超过 \(k\)?
设 \(i\) 在序列中的位置为 \(to_i\),\(f_i\) 表示 \(1\le j\lt to_i\) 且 \(p_j>i\) 的 \(j\) 的个数,因为每次交换最多只能使一个 \(f\) 减一,所以下界是 \(\sum_{i=1}^n\max(f_i-k,0)\)。考虑取最小的 \(i\) 使 \(f_{p_i}>k\),如果 \(p_{i-1}<p_i\) 那么 \(f_{p_{i-1}}\ge f_{p_i}>k\),矛盾!所以 \(p_{i-1}>p_i\),也即交换 \(p_{i-1},p_i\) 可使大于 \(k\) 的 \(f_{p_i}\) 减少 \(1\) 而 \(f_{p_{i-1}}\) 不变,从而达到下界。
在这个过程中,在位置 \(i\) 前且值比 \(p_i\) 大的可能被交换到 \(i\) 后,在位置 \(i\) 后且值比 \(p_i\) 小的可能被交换到 \(i\) 前,与位置 \(i\) 的交换只可能有这两种情况。对于 \(p=1\) 的数,后面不会有比它小的数,即只可能是前面比它大的数换到它后面,这样换完后它前面数的个数也是确定的,也就是说 \(1\) 在最终排列里的位置是定的。因为 \(1\) 在哪不影响每个数前面比其大的数的个数,且一个数与其前一个数交换当前仅当它们形成了逆序对,所以把 \(1\) 从交换后的排列中删去没有影响,且剩下的 \(n-1\) 个数变成了一个子问题,每次可以得出最小的数的位置在最终排列里是确定的,于是 \(p\) 经过交换后得到的最终满足条件的序列也是唯一确定的。
根据上述分析我们就可以从满足条件的排列 \(p\) 推出原来的排列个数:考虑从 \(p\) 中从小到大删数,假设已经删了 \(1\sim i-1\) 了,那目前维护的答案表示如果 \(i\sim n\) 都填好了,在此基础上 \(1\sim i-1\) 有几种填法。对于 \(i\),如果其前面比它大的数个数 \(<k\),那当 \(i+1\sim n\) 填好后 \(i\) 的位置一定不会变,对答案不影响;如果其前面比它大的数个数 \(=k\),那当 \(i+1\sim n\) 填好后 \(i\) 可以填在它当前位置及之后的任意一个位置,有 \(n-i+1-f_i\) 种,那么答案乘上 \(n-i+1-f_i\)。所有数都删完后就得到了答案。
于是时间复杂度 \(O(n)\),空间复杂度 \(O(n)\)。
6.AT_agc043_d [AGC043D] Merge Triplets
如果 \(P\) 中存在相邻 \(r-l+1\) 个数 \(p_l\sim p_r(l<r)\),满足 \(\forall i\in[l+1,r]\),\(p_l>p_i\),那么 \(p_l\sim p_r\) 在 \(A\) 中一定被划分到同一块中。也就是说找到 \(P\) 的所有前缀最大值的位置,每个前缀最大值到下一个前缀最大值前一个数这一段在 \(A\) 中一定在同一块里,每一段的长度都不超过 \(3\)。
枚举 \(P\) 中有 \(x\) 个段长为 \(2\),\(y\) 个段长为 \(3\),则有 \(3n-2x-3y\) 个段长为 \(1\),那么长为 \(3\) 的段在 \(A\) 中自成一块,长为 \(2\) 的块一定要和长为 \(1\) 的块拼在一起才能在 \(A\) 中形成一块,也就是说 \(x\le3n-2x-3y\)。此时方案数为 \(\frac{(3n)!}{(2!)^x(3!)^y(1!)^{3n-2x-3y}}(0!)^{3n-2x-3y}(1!)^x(2!)^y\frac{1}{x!y!(3n-2x-3y)!}=\frac{(3n)!}{2^x3^yx!y!(3n-2x-3y)!}\),表示把 \(3n\) 个数划分成 \(x+y+(3n-2x-3y)\) 组,其中 \(x\) 组大小为 \(2\),\(y\) 组大小为 \(3\),\(3n-2x-3y\) 组大小为 \(1\),由于每组只需满足最大的数在组内最前面,所以组内分别有 \(0!,1!,2!\) 种顺序,从全局来看每个段是按其最大值排序的,所以段与段之间没有顺序,而我们这样算出来的是大小相同的组间有顺序,大小不同的组间没有顺序,所以还要把相同组间的顺序除掉。
时间复杂度可以做到 \(O(n^2)\),空间复杂度 \(O(n)\)。
拓展:上述做法依赖 \(M\) 是质数,如果 \(M\) 不是质数的话,这里给出另一种做法。
对于一个排列 \(P\),设其前缀最大值到下一个前缀最大值前一个数组成的每一段长度分别为 \(a_1,\cdots,a_k\),从后往前考虑每个前缀最大值是下一个前缀最大值之前最大的数的概率,那么方案数为 \(\frac{(3n)!}{a_1(a_1+a_2)\cdots(a_1+a_2+\cdots+a_k)}\)。于是设 \(dp_{i,j}\) 表示已经填了 \(i\) 个数,长为 \(1\) 的段数减去长为 \(2\) 的段数为 \(j\) 的方案数,转移考虑下一段的长度是 \(O(1)\) 的。时间复杂度 \(O(n^2)\),空间复杂度可以滚动数组做到 \(O(n)\)。
7.AT_agc043_c [AGC043C] Giant Graph
没讲。
8.AT_agc039_e [AGC039E] Pairing Points
令 \(n=2N\)。枚举和 \(1\) 连线的点是 \(i\),那么就破环成链变成了一个序列上的问题:有 \([2,n]\) 的点,其中 \(i\) 连向区间外的点,剩下点内部匹配,问可能的方案数?
设 \(f_{i,j,k}\) 表示有 \([i,j]\) 的点,其中 \(k\) 连向区间外的点 \(o\),剩下点内部匹配,可能的方案数。为了连出一棵树,\([i,k-1]\) 和 \([k+1,j]\) 之间一定有边相连。由于\([i,k-1]\) 和 \([k+1,j]\) 之间的边会和 \((k,o)\) 这条边相交,所以\([i,k-1]\) 和 \([k+1,j]\) 之间的边不能相交,否则会连出环。于是就存在一条边 \((x,y)\) 使得 \(x\in[i,k-1],y\in[k+1,j]\) 且 \(x,y\) 分别是 \([i,k-1]\) 和 \([k+1,j]\) 之间的边的两端点中最靠近 \(i\) 和最靠近 \(j\) 的。如下图:
那么 \((x,y)\) 与 \((k,o)\) 的交点 \(T\) 是所有 \([i,k-1]\) 和 \([k+1,j]\) 之间的边与 \((k,o)\) 的交点中最靠上的,也就是说从 \(T\) 出发向下走可以走到 \([i,j]\) 内的所有点,并且在 \((o,k)\) 上第一次是往左走的就只能走到 \([i,k-1]\) 中的所有点,第一次是往右走的就只能走到 \([k+1,j]\) 中的所有点。
设在 \(T\) 处就开始向着 \(x\) 方向走,能走到的编号最大的点为 \(p\),此时能走到的编号最小的点为 \(i\),那么对于 \((i,p)\) 中的任意一个点 \(u\),\(u\) 往左连不能跨过 \(T\) 到 \(i\) 的路径,\(u\) 往右连不能跨过 \(T\) 到 \(p\) 的路径(否则 \(p\) 就不是能走到的标号最大的点了),那么与 \(u\) 相连的点在 \([i,p]\) 中,也就是说 \([i,p]\) 除了 \(x\) 其它点连的线都是内部匹配。同理,在 \(k\) 右边也存在一个 \(q\) 使得在 \(T\) 处就开始向着 \(y\) 方向走,能走到的编号最小的点为 \(q\)。于是这就被分成了三个子问题,即 $$f_{i,j,k}=\sum_{p=i}^{k-1} \sum_{q=k+1}^{j} \sum_{x=i}^p \sum_{y=q}^j f_{i,p,x}f_{p+1,q-1,k}f_{q,j,y}[A_{x,y}=1]$$
这是 \(O(n^7)\) 的,不过由于其极小的常数所以可以通过。不过我们还可以把它再优化。
首先转移肯定要按 \(j-i\) 从小到大转移,令 \(l=j-i\),那么 \(j=i+l\),且此时 \(j-i<l\) 的 \(f\) 的值我们都求出来了。再依次枚举 \(p,q,i\),于是里面就变成了枚举 \(k,x,y\),\(f_{i,j,k}+=f_{i,p,x}f_{p+1,q-1,k}f_{q,j,y}[A_{x,y}=1]\)。令 \(g_{i,p,y}=\sum_{x=i}^p f_{i,p,x}[A_{x,y}=1]\),那么变成枚举 \(k,y\),\(f_{i,j,k}+=g_{i,p,y}f_{p+1,q-1,k}f_{q,j,y}\)。此时 \(k,y\) 是相互独立的,可以 \(O(n)\) 计算出 \(f\),算上外面枚举的 \(l,p,q,i\) 是 \(O(n^5)\) 的。同时 \(g\) 可以按定义 \(O(n^4)\) 求出。
时间复杂度 \(O(n^5)\),空间复杂度 \(O(n^3)\)。
9.AT_agc036_f [AGC036F] Square Constraints
在二维平面上标出 \(N\) 个点 \((i,P_i)\),那么限制就变成了每个点到原点的距离要在 \([N,2N]\) 之间,并且每行每列有且仅有一个点。如下图(图源 Sol1):
记 \(L_i=\max(\lceil\sqrt{N^2-i^2}\rceil,0)\),\(R_i=\min(\lfloor\sqrt{4N^2-i^2}\rfloor,2N-1)\)。考虑如果没有下限(如下图)怎么做,那么按 \(R_i\) 从小往大确定 \(P_i\),本来 \(P_i\) 有 \(R_i+1\) 种取值,但不能和已经填过的相同,并且已经填过的数都在 \([0,R_i]\) 的范围内,所以 \(P_i\) 还剩下 \(R_i+1-(2N-1-i)\) 种可能,答案就是 \(\prod_{i=0}^{2N-1}R_i+1-(2N-1-i)\)。
那么有下限我们自然就想到了容斥。容斥后有的数的上界是 \(R_i\),有的数的上界是 \(L_i-1\),但是所有数都没有下界(或者说下界都是 \(0\))。假设知道了哪些数的上界是 \(L_i-1\),那么我们就可以把所有数按 \(R\) 从小到大排序再用上述做法解决。并且我们发现,排好序后序列一定形如 \([0,N)\) 的容斥过的部分和 \([N,2N)\) 的所有数一起按 \(R\) 从小到大排序,排好序后再在序列最后按 \(R\) 从小到大接上 \([0,N)\) 没容斥过的部分。
把 \([0,N)\) 内的数的权值设为 \(L_i-1\),再把 \([N,2N)\) 内的数的权值设为 \(R_i\),按权值从小到大排序,记 \(f_i\) 表示按上述排序的顺序前 \(i\) 个数中在 \([N,2N)\) 中的个数,枚举 \(k\) 表示钦定 \(k\) 个数的上界为 \(L_i-1\),设 \(dp_{i,j}\) 表示在所有 \(2N\) 个数中已经按我们上述排序的顺序考虑了前 \(i\) 个数,这里面钦定了 \(j\) 个数的上界为 \(L_i-1\),方案数是多少。
转移考虑下一个加入的数 \(p\) 如果在 \([N,2N)\),那么有 \(R_p+1-f_i-j\) 种可能的位置;如果 \(p\) 在 \([0,N)\),一种情况是钦定它的上界是 \(L_p-1\),那么有 \(L_p-f_i-j\) 种可能的位置;如果不钦定它的上界,那么有 \(R_p+1-N-k-(i-f_i-j)\) 种可能。最后 dp 完后把答案加上 \((-1)^kdp_{2N,k}\) 即可。
时间复杂度 \(O(N^3)\),空间复杂度 \(O(N^2)\)。
10.AT_agc035_e [AGC035E] Develop
是一道十分抽象的题。
题目要求最终黑板上数字的可能状态有多少种,考虑计数被删掉的数字的状态有多少种。设被删掉的数的集合为 \(S\),把黑板上的每个数都看成一个点并从小到大从左到右排列,从 \(x\) 向 \(x-2\) 和 \(x+K\) 连有向边(下称 \(x\rightarrow x-2\) 为向左的边,\(x\rightarrow x+K\) 为向右的边),那么 \(S\) 是合法的当且仅当 \(S\) 在原图的导出子图中无环,这是因为如果无环的话可以按拓扑序来删数,有环的话假设环上最后一个被删去的数为 \(x\),那环上 \(x\) 指向的数会被重新写到黑板上,也就是从 \(S\) 中被删去,即无法形成环,矛盾。
如果 \(K\) 是偶数的话,那么原图奇偶独立,对奇偶分别计数再把答案相乘。不妨考虑只看奇数,限制就是对于连续 \(\frac{K}{2}+1\) 个数,至少有一个没选,那么设 \(dp_{i,j}\) 表示前 \(i\) 个数最靠后的极长连续段选了 \(j\) 个数,转移就看下一个数选(转移到 \(dp_{i,j+1}\))或不选(转移到 \(dp_{i,0}\)),并时刻保持第二维 \(\le\frac{K}{2}\)。时间复杂度 \(O(NK)\),空间复杂度 \(O(NK)\)。
如果 \(K\) 是奇数,那么所有环都经过了偶数条向右的边。下面我们证明如果存在一个环经过的向右的边的次数 \(>2\),那么一定存在一个环经过的向右的边的次数 \(=2\)。
设这个环最靠左的数为 \(a\),那么 \(a\) 上一步一定是从 \(a+2\) 来的,下一步一定会跳到 \(a+K\)。同时由于 \(a\) 是最靠左的点,所以 \(a+K\) 是这个环上最靠左的由向右的边跳来的点,于是进一步可以推得 \(a+2\) 是由 \(a+4\) 来的,……,\(a+K-1\) 是由 \(a+K+1\) 来的。接着,\(a+K\) 又会一直往左走到一个点 \(b\) 满足 \(a<b\le a+K\),\(a,b\) 异奇偶,且 \(b\) 的下一步是跳到 \(b+K\)。有了这些信息后我们只需考虑 \(a+K+1\) 是从哪来的,如果是从 \(a+1\) 来的,那么根据 \(a\) 是最靠左的点可以推得 \(a+1\) 是由 \(a+3\) 来的,……,\(a+K-2\) 是由 \(a+K\) 来的,那么这就形成了一个经过的向右的边的次数 \(=2\) 的环;否则 \(a+K+1\) 是由 \(a+K+3\) 来的,再用同样的方法可以推出如果没有形成一个经过的向右的边的次数 \(=2\) 的环,则 \(a+K+3\) 是由 \(a+K+5\) 来的,……,\(b+K-2\) 是由 \(b+K\) 来的,于是还是形成了一个经过的向右的边的次数 \(=2\) 的环。所以得证。
所以给定一个 \(S\) 判断其是否合法只要对每个 \(S\) 中的数 \(x\) 判断是否存在一个环,满足环内的数都在 \(S\) 中,环经过的向右的边的次数 \(=2\),且 \(x\) 是这个环中最靠右的点。接下来的判断方法称为「找环路」:首先找到最小的 \(y\) 满足 \(y,y+2,\cdots,x\) 都在 \(S\) 中,然后找到 \(y,y+2,\cdots,x\) 中最小的 \(z\) 满足 \(z+K\in S\)。如果找不到这样的 \(z\) 说明从 \(x\) 出发无法到达 \(x\) 右侧的点或再次到达 \(x\),即 \(x\) 不再环中。否则,找到最小的 \(w\) 使得 \(w,w+2,\cdots,z+K\) 都在 \(S\) 中,那么只需要判断 \(w\) 能否跳到 \(x\) 及其左边的点,即 \(w+K\le x\)。设 \(z,z+2,\cdots,x\) 中有 \(a=\frac{x-z}{2}+1\) 个点,\(w,w+2,\cdots,z+K\) 中有 \(b=\frac{z+K-w}{2}+1\) 个点,那么 \(w=z+K-2(b-1)=x-2(a-1)+K-2(b-1)=x+K-2(a+b)+4\),所以 \(w+K\le x\) 即 \(K+2\le a+b\)。\(a+b\) 是什么?\(a+b\) 就是 \(x\rightarrow\cdots\rightarrow z\rightarrow z+K\rightarrow\cdots\rightarrow w\) 这条路径上的点数。
于是就可以 dp 了!设 \(dp_{i,l_1,l_2}\) 表示考虑了 \([1,i]\) 中的与 \(i\) 奇偶性相同的点和 \([1,i+K]\) 中与 \(i+K\) 奇偶性相同的点,\(i\) 通过「找环路」找到的路径上的点数为 \(l_1\)(如果 \(i\) 不在 \(S\) 中就是 \(0\)),\(i+K\) 一直往左跳最多可以跳 \(l_2\) 个点(含 \(i+K\),如果 \(i+K\) 不在 \(S\) 中就是 \(0\)),此时的方案数。考虑由 \(dp_{i,l_1,l_2}\) 转移到 \(dp_{i+2,l_1',l_2'}\),首先 \(l_2'\) 根据 \(i+K+2\) 选不选是好更新的,知道了 \(l_2'\) 后如果 \(i+2\) 不选那 \(l_1'=0\),如果 \(i+2\) 选的话看 \(l_1\) 是否为 \(0\),如果不是那 \(l_1'=l_1+1\),否则第一次就要走向右的边,即 \(l_1'=l_2'+1\)。由于要保证方案合法,所以 \(l_1\le K+1\),\(l_2\) 超过了 \(K+1\) 的话和 \(l_2=K+1\) 没有区别,所以可以看成 \(l_2=\min(l_2,K+1)\le K+1\)。所以状态数是 \(O(NK^2)\) 的,转移是 \(O(1)\) 的。
时间复杂度 \(O(NK^2)\),空间复杂度 \(O(NK^2)\)。
11.AT_agc035_d [AGC035D] Add and Remove
这个题我竟然还做过。
考虑每个元素对答案的贡献。首先第一个数和最后一个数是不会被删的,假设最后一次删的数是 \(A_i\),那么 \(A_1\) 会加上 \(A_i\),\(A_n\) 也会加上 \(A_i\),\(A_i\) 对答案贡献了 \(2\) 次;再假设倒数第二次删的是 \(A_j\)(不妨设 \(1<j<i\)),那么 \(A_1\) 会加上 \(A_j\) 对答案贡献了 \(1\) 次,\(A_i\) 也会加上 \(A_j\),而 \(A_i\) 对答案贡献了 \(2\) 次,所以 \(A_j\) 总共对答案贡献了 \(3\) 次。
由此设出 dp 状态:\(dp(l,r,L,R)\) 表示只考虑区间 \([l,r]\) 的数,\(A_{l-1}\) 对答案贡献 \(L\) 次,\(A_{r+1}\) 对答案贡献 \(R\) 次,这个区间对答案贡献的和的最小值。枚举最后删去的数的位置,那么 \(dp(l,r,L,R)=\min_{i=l}^r dp(l,i-1,L,L+R)+dp(i+1,r,L+R,R)+(L+R)A_i\)。答案是 \(dp(2,n-1,1,1)+A_1+A_n\)。
因为 \((l,r)\) 有 \(O(n^2)\) 对,\((L,R)\) 有 \(O(n)\) 层,每层到下一层有两种变化,即有 \(O(2^n)\) 种,所以总状态数是 \(O(n^22^n)\) 的。算上转移的 \(O(n)\) 时间复杂度是 \(O(n^32^n)\) 的,但是如果用 dfs 只求解有用的 \(dp\) 数组会发现跑不满,所以实际上会更快。空间复杂度 \(O(n^22^n)\)。
12.AT_agc034_f [AGC034F] RNG and XOR
对每个 \(i\) 分别考虑怎么求出 \(x\) 第一次变成 \(i\) 的期望操作次数。记 \(P(A)\) 表示事件 \(A\) 发生的概率,定义 \(F(x)=\sum_{n\ge0}P(n\) 次后第一次变为 \(i)x^n\),\(G(x)=\sum_{n\ge0}P(n\) 次后变为 \(i)x^n\),\(H(x)=\sum_{n\ge0}P(n\) 次后变为 \(0)x^n\)。那么 \(G=FH\),只要求出 \(G\) 和 \(H\) 就可以知道 \(F\),知道 \(F\) 之后答案即为 \(F'(1)\)。
下面考虑怎么求 \(G\),设 \(A_i\) 表示每次操作以 \(A_i\) 的概率把 \(x\) 变成 \(x\oplus i\),其中 \(\oplus\) 是异或。由于初始时 \(x\) 是 \(0\),那么 \(n\) 次操作后得到 \(i\) 的概率就是把 \(n\) 个 \(A\) 做异或卷积,得到的结果的第 \(i\) 项。也就是把 \(A\) 先变成 \(FWT(A)\)(其中 \(FWT\) 是异或卷积的正变换),再把 \(n\) 个 \(FWT(A)\) 点值相乘,最后再 \(IFWT\) 回去的第 \(i\) 项。所以 \(P(n\) 次后第一次变为 \(i)=\sum_{j=0}^{2^n-1}(-1)^{popcount(i\&j)}(FWT(A)_j)^n\),于是 \(G(x)=\sum_{n\ge0}(\sum_{j=0}^{2^n-1}(-1)^{popcount(i\&j)}(FWT(A)_j)^n)x^n=\sum_{j=0}^{2^n-1}(-1)^{popcount(i\&j)}\sum_{n\ge0}(FWT(A)_jx)^n=\sum_{j=0}^{2^n-1}(-1)^{popcount(i\&j)}\frac{1}{1-FWT(A)_jx}\)。同时 \(H\) 就是 \(i=0\) 时的 \(G\),即 \(H(x)=\sum_{j=0}^{2^n-1}\frac{1}{1-FWT(A)_jx}\)。
接下来我们把 \(F=\frac{G}{H}\) 求导,结合 \((\frac{1}{1-Ax})'=\frac{A}{(1-Ax)^2}\),得 \(F'=\frac{G'H-H'G}{H^2}=\frac{(\sum_{j=0}^{2^n-1}(-1)^{popcount(i\&j)}\frac{FWT(A)_j}{(1-FWT(A)_jx)^2})(\sum_{j=0}^{2^n-1}\frac{1}{1-FWT(A)_jx})-(\sum_{j=0}^{2^n-1}\frac{FWT(A)_j}{(1-FWT(A)_jx)^2})(\sum_{j=0}^{2^n-1}(-1)^{popcount(i\&j)}\frac{1}{1-FWT(A)_jx})}{(\sum_{j=0}^{2^n-1}\frac{1}{1-FWT(A)_jx})^2}\)。由于 \(\sum_{i=0}^{2^n-1}A_i=1\),\(0<A_i<1\),于是有 \(FWT(A)_0=\sum_{i=0}^{2^n-1}A_i=1\),对 \(0<i<2^n\) 有 \(|FWT(A)_i|<1\),因为在 \(FWT\) 的式子里有加有减。那么除了 \(1-FWT(A)_0x\) 做分母的情况其它地方都可以直接把 \(x=1\) 代进去计算。
考虑分子分母同乘 \((1-x)^2\)。对于分母相当于括号内都乘上 \(1-x\),由于分母中 \(j\ne 0\) 时分母中不含因式 \(1-x\),所以代入 \(x=1\) 后就都是 \(0\),而 \(j=0\) 时分母就是 \(1-x\),所以乘完后是 \(1\),所以分母就是 \(1\)。对于分子,考虑对减号两边的式子都把 \((x-1)^2\) 乘到第一个括号中,同样考虑 \(j=0\) 和 \(j\ne 0\) 时的情况可知最终减号两边的式子的第一个括号中得到的结果都为 \(1\),也就是分子还剩下 \((\sum_{j=0}^{2^n-1}\frac{1}{1-FWT(A)_jx})-(\sum_{j=0}^{2^n-1}(-1)^{popcount(i\&j)}\frac{1}{1-FWT(A)_jx})=(\sum_{j=1}^{2^n-1}\frac{1}{1-FWT(A)_jx})-(\sum_{j=1}^{2^n-1}(-1)^{popcount(i\&j)}\frac{1}{1-FWT(A)_jx})=(\sum_{j=1}^{2^n-1}\frac{1}{1-FWT(A)_j})-(\sum_{j=1}^{2^n-1}(-1)^{popcount(i\&j)}\frac{1}{1-FWT(A)_j})\)。对于前者直接算,对于后者对 \(\frac{1}{1-FWT(A)_j}\) 再做一次 \(FWT\) 就可以对所有的 \(i\) 一起求出答案了。
时间复杂度 \(O(n2^n)\),空间复杂度 \(O(2^n)\)。
13.AT_agc032_f [AGC032F] One Third
没讲。
14.AT_agc032_e [AGC032E] Modulo Pairing
没讲。但我竟然也做过。
把所有 \(a\) 从小到大排序,对于每组配对用线连起来,如果一条线连的两个数 \(a_i,a_j\) 满足 \(a_i+a_j<M\),那么这条线染成蓝色,否则染成红色。结论是:存在一条分界线,使得两边的点之间没有连线,左边内部全是蓝线,右边内部全是红线,且左右内部都是最小的匹配最大的,次小的匹配次大的,以此类推。如下图(图源粉兔):
证明就是考虑同色相交或者相离,以及异色相交或者包含,都可以调整成不劣的情况。如下图:
于是就有了枚举分界线然后暴力计算的 \(O(N^2)\) 做法。怎么优化呢?我们考虑弱化条件,连红线的两个数之和一定要 \(\ge M\),但连蓝线的两个数之和没有要求,这样答案只会变大或不变,且最优情况的答案仍然不变,所以算出来的结果是正确的。我们发现分界线越往左,答案会越小,并且红线越不能满足条件,所以可以二分这个分界线,再计算就好了。
时间复杂度 \(O(N\log N)\),空间复杂度 \(O(N)\)。
15.AT_agc030_e [AGC030E] Less than 3
对于一个 \(01\) 串,在相邻的 \(0\) 和 \(1\) 之间画一条红线,在相邻的 \(1\) 和 \(0\) 之间画一条蓝线,在最左侧和最右侧画无数条红蓝交错的线,保证所有线是红蓝交错的。那么单位翻转相当于把任意一条线右移或左移一位,连续段长度不超过 \(2\) 相当于任意两条相邻的线距离不超过 \(2\),把 \(s\) 变成 \(t\) 等价于通过移动线使它们线的位置一一对应。
如果知道了每条 \(s\) 中的线对应哪条 \(t\) 中的线,那么移动次数的下界是每条对应的线的距离之和。事实上,这个下界是能达到的,由于任意两条相邻的线的距离不超过 \(2\),所以不存在两条相邻的线一条要往右移另一条要往左移,也就是说一定存在若干条不动的线,满足任意两条相邻的不动的线之间的线的移动方向是相同的,不妨设为全都要向左移,那每次移还没有到达对应位置的最右边的可以移动的线一定满足条件。由于本质不同的对应关系只有 \(O(n)\) 种,所以可以枚举对应关系然后直接计算答案。
时间复杂度 \(O(n^2)\),空间复杂度 \(O(n)\)。
16.QOJ#5169. 夹娃娃
chen_03 Orz!
令 \(m=520\),第 \(i\) 次查询时给定的 \(01\) 串是 \(S'\),某些店至少要花费的钱数是 \(k'\),你有的钱数是 \(m'\)。
首先对于每家店 \(i\) 可以求出生成函数 \(F_i(x)\),其中 \([x^n]F_i(x)\) 表示在第 \(i\) 家店花费 \(n\) 元的方案数。具体方法是一开始令 \([x^n]F(x)=[n=0]\),每次加入一台价格是 \(b\),有 \(c\) 个娃娃的娃娃机,那么 \([x^n]F(x)+=[x^{n-b}]F(x)+[x^{n-2b}]F(x)+\cdots+[x^{n-cb}]F(x)\),这可以用模 \(b\) 意义下的前缀和单次 \(O(m)\) 更新。这部分的时间复杂度是 \(O(nm^2)\) 的。
接下来我们考虑对询问容斥。记 \(F_{i,k}(x)\) 表示 \(F_{i}(x)\) 只保留 \(x\) 的次数小于 \(k\) 的部分的生成函数。如果没有限制,那么答案的生成函数就是 \(\prod_{i=1}^nF_i(x)\);如果位置 \(j\) 处有限制至少花 \(k\) 元,那么在上述式子中 \(i=j\) 时我们不乘上 \(F_i(x)\),而是乘上 \(F_i(x)-F_{i,k}(x)\)。一开始我们可以令 \(G_{S,k}(x)=\prod_{i=1}^{n}(S_i=0? F_i(x):-F_{i,k}(x))\)(\(S\) 是一个 \(n\) 位 \(01\) 串),如果能把 \(S\in[0,2^n)\) 的 \(G_{S,k}(x)\) 都求出来那再把 \(S\) 做个高维前缀和就求出了我们想要的式子。
对于每个 \(i\in[1,n],k\in[1,m]\),我们考虑求出 \(F_{i,k}(x)\) 的点值。设 \(M\) 表示下述算法中最大需要的点值长度(显然 \(m\le M\le nm\)),所以要计算 \(O(M)\) 个点值,不妨令这些点值是从 \(0\) 开始的 \(O(M)\) 个自然数处的点值。由于 \(F_{i,k+1}(x)=F_{i,k}(x)+([x^k]F(x))x^k\),故 \(F_{i,k+1}(x)\) 的点值可由 \(F_{i,k}(x)\) 的点值 \(O(1)\) 推得,从而对这 \(O(nm)\) 个多项式每个多项式都求 \(O(M)\) 个点值的复杂度是 \(O(nmM)\) 的。
考虑知道了点值怎样还原出原多项式。假设 \(f(x)\) 在 \(0,\cdots,M\) 处的点值分别为 \(y_0,\cdots,y_M\),那么 \(f(x)=\sum_{i=0}^M y_i\prod_{j\ne i}\frac{x-j}{i-j}\),可以在 \(O(M^2)\) 时间内对每个 \(i\) 预处理 \(\prod_{j\ne i}\frac{x-j}{i-j}\) 中 \(x\) 的不同次幂的系数(\(i\) 时的系数可以由 \(i-1\) 时的系数 \(O(M)\) 推得),那么查询时由于只需查询对于每个 \(i\),\(x^{m'}\) 的系数乘上 \(y_i\) 的积之和,所以单次查询复杂度是 \(O(M)\) 的。
接下来继续考虑怎么对每个 \(S\in[0,2^n),k\in[1,m]\) 求 \(G_{S,k}(x)\)。设对于 \(S\) 中为 \(0\) 的位对应的多项式的乘积为 \(A_S(x)\)(与 \(k\) 无关),\(S\) 中为 \(1\) 的位对应的多项式的乘积为 \(B_{S,k}(x)\)。那么 \(A_S(x)\) 可以由把 \(S\) 的某个 \(0\) 变成 \(1\) 后的 \(S'\) 的 \(A_{S'}(x)\) \(O(m^2)\) 推得,得到 \(A_S(x)\) 并只保留其前 \(O(m)\) 位后可以在 \(O(2^nmM)\) 时间内将其转化为 \(0\) 开始的 \(O(M)\) 个点值;对于 \(B_{S,k}(x)\),求出其 \(0\) 开始的 \(O(M)\) 个点值,只用求 \(O(M)\) 个的原因是从全局考虑,如果 \(S'\) 中 \(1\) 的个数乘上 \(k'\) 大于 \(m'\) 时不用计算,这不仅会让常数减小近一半,还保证了需要计算时所有 \(S'\) 中为 \(1\) 的位置对应的多项式乘起来次数不超过 \(m\),更不会超过 \(M\),时间复杂度 \(O(2^nmM)\)。
把 \(A_S(x)\) 和 \(B_{S,k}(x)\) 的点值相乘,我们得到了所有 \(G_{S,k}(x)\) 的点值,现在可以做高维前缀和了,这个复杂度是 \(O(2^nmMn)\) 的。于是单次查询就可以通过查询 \([x^{m'}]G_{S',k'}(x)\) 做到 \(O(M)\)。
在这个做法中,只需令 \(M=2m\)(\(A_S(x)\) 和 \(B_{S,k}(x)\) 两个长为 \(m\) 的多项式相乘可以达到 \(2m\) 级别),时间复杂度是 \(O(n2^nm^2+qm)\),但这还不够快,且预处理和询问的时间差距有点大。我们考虑用分块均衡复杂度,将原序列分成 \(B\) 块,每块长 \(L\),代入上述过程分析得 \(M=(B+1)m\)(每个块 \(A_S(x)\) 长 \(m\),有 \(B\) 个块乘起来总长 \(Bm\),\(B_{S,k}(x)\) 每个块乘起来长不超过 \(m\),总共可以达到 \((B+1)m\) 级别),对于每个块单次查询变成了 \(O(M)\),预处理复杂度的瓶颈高维前缀和变成了 \(O(2^LmML)\),那么 \(B\) 块的复杂度之和为 \(O(qBM+B2^LmML)=O(qBM+n2^LmM)=O(qB^2m+n2^LBm^2)\),取 \(B=5\) 时比较优(此时 \(L\le 3\))。
17.QOJ#5097. 小 P 爱学习
假设所有书被分成了 \(k\) 组,那么对答案的贡献就是从每组中选出一个数相乘,所有选法的权值和。反过来考虑,假设从原序列中选出了 \(k\) 本书 \(i_1,\cdots,i_k\),那么对答案的贡献就是 \(\prod_{j=1}^k a_{i_j}\) 乘上 \(i_1,\cdots,i_k\) 在不同组中,其余 \(m-k\) 本书被分到这 \(k\) 组中,使得每组中的书本数都是 \(m\) 的倍数的方案数。由于所有书是轮换对称的,所以乘上的方案数只和 \(k\) 有关。现在原问题被转化成了两个问题,第一个是对于每个 \(k\in[1,n]\),求所有选出 \(k\) 本书的方案中选出的每本书的权值乘积之和,第二个是对于每个 \(k\in[1,n]\),求选出 \(k\) 本书后 \(\prod_{j=1}^k a_{i_j}\) 应该乘上的贡献系数。
第一个问题是好做的。设 \(dp_{i,j}\) 表示前 \(i\) 本书中选出 \(j\) 本的所有方案的乘积之和,转移枚举下一本书选不选是 \(O(1)\) 的,时间复杂度就是状态数即 \(O(n^2m)\)。
对于第二个问题,首先把 \(k\) 本选出的书各成一组,假设第 \(i\) 组中的有 \(x_im\) 本书,满足 \(x_i\ge 1\),\(\sum_{i=1}^{k} x_i=n\),那么答案为 \(\binom{nm-k}{x_1m-1,\cdots,x_km-1}=(nm-k)!\prod_{i=1}^{k}\frac{1}{(x_im-1)!}\)。枚举 \(k\),设 \(F(x)=\sum_{i\ge1}\frac{1}{im-1}x^i\),那么答案为 \((nm-k)![x^n](F^k)\)。考虑 BSGS,令 \(B=\lfloor\sqrt n\rfloor\),暴力求出 \(F^1,F^2,\cdots F^B\),再暴力求出 \(F^B,F^{2B},\cdots F^{\lfloor\frac{n}{B}\rfloor B}\) 共 \(O(\sqrt n)\) 个多项式,查询时把 \(k\) 拆成 \(\lfloor\frac{k}{B}\rfloor B\) 和 \(k-\lfloor\frac{k}{B}\rfloor B\) 即可单次 \(O(n)\) 求出 \(x^n\) 的系数。
总时间复杂度 \(O(n^2m+n^{2.5})\),空间复杂度 \(O(n^2m+n^{2.5})\)。
18.QOJ#5089. 环覆盖
一张图是可环覆盖的,当且仅当每个点的度数是偶数,如果不都是偶数显然不可能是可环覆盖的,如果都是偶数可以通过欧拉回路来构造覆盖方案。
如果只保留某一组边集可以让原图成为可环覆盖的,那么称这组边集是合法的。对于原图的每个连通块,边集是否合法是独立的,只有当每个连通块的边集都是合法的整张图的边集才是合法的,如果我们可以对每个连通块求出答案,那么可以通过至多 \(O(n)\) 次暴力卷积把答案合并。这部分的复杂度是 \(O(nm^2)\) 的。下面只用考虑连通图。
对于一张连通图,我们把一组合法的边集称为环路,如果把边标号为 \(0\sim m-1\),并根据每条边是否在环路中给每个环路一个对应的 \(m\) 位的二进制串,可以发现两个环路异或起来还是环路,因为每个点的度数仍均是偶数。那么所有的环路的二进制串一定组成线性基,考虑求出一组基底。跑出连通图的一棵 dfs 树,对于每条非树边以及它在树上形成的路径组成的环路成为基础环路,对于每个包含不止一条树边的环路一定可以由所有包含的树边对应基础环路异或得到,否则把这个环路和这些基础环路全异或起来还是一个环路,且这个环路不为空、只包含树边,这显然矛盾!所以我们找到了所有基础环路构成的一组大小为 \(m-n+1\) 的基底。由于如果基底的大小大于 \(m-n+1\),那么我们一定可以通过异或消除非树边得到一个不为空且只包含树边的环,这显然矛盾!所以基底的大小不超过 \(m-n+1\),也就是恰好为 \(m-n+1\)。
现在问题变成了有一个大小为 \(m-n+1\) 的线性基,其中每个数都 \(<2^m\),问对于每个 \(i\in[0,m]\),线性基有多少个子集使得其子集内部所有元素异或起来得到的结果恰有 \(i\) 个 \(1\)。用 CF1336E2 Chiori and Doll Picking (hard version) 中 \(m\) 较大的做法,可以将本问题做到 \(O(2^{m-(m-n+1)}+(m-n+1)m+m^3)=O(2^n+m^3)\)。
总时间复杂度 \(O(2^n+m^3)\),空间复杂度 \(O(n+m)\)。
19.LOJ#3653. 「2021 集训队互测」抽奖机
没讲。