【题解】XXI Open Cup. GP of Tokyo

发布时间 2023-04-27 11:02:10作者: Qiuly

// created on 23.04.18

A. Ascending Matrix

先不考虑 \(a_{R,C}=V\) 的限制,考虑原问题,我们要找到 \(k-1\) 条值域轮廓线(起点 \((n,0)\) 终点 \((0,m)\)),使相互不越过。将第 \(i\) 条向下、右平移 \(i-1\) 格,变成了路径不交问题,可以 LGV 引理处理。

考虑 \(a_{R,C}=V\) 的限制,其实是 \((R+V-2,C+V-2)\) 这个位置 可以放数,并且上侧折线数恰好 \(V-1\) 条。那么枚举这条 \(y=c-x\) 线上所有点(作为中转点),如果在上侧就多一个 \(x\),最后某个起点到某个终点的方案是 \(a+bx\) 的形式。只要插值就可以了。

时间复杂度 \(O(k^2(n+m+k)+k^4)\)
提交记录:Submission #97792 - QOJ.ac

B. Bit Operation

相当于每次从相邻两数中,挑选删除一个数。

那么枚举最后留下来的数,然后左右两侧分别是子问题,方案数是容易计算的。

时间复杂度 \(O(n)\)
提交记录:Submission #97799 - QOJ.ac

C. Count Min Ratio

注意答案为:

\[\begin{aligned} &\sum_{d\geq 1}\sum_{l_B}\sum_{l_Bd\leq l_R\leq R-d(B-l_B)}{l_B+l_R\choose l_B}{B-l_B+R-l_R\choose B-l_B}\\ =&\sum_{l_B}\sum_{d\geq 1}\sum_{0\leq t\leq R-dB}{(d+1)l_B+t\choose l_B}{B+R-(d+1)l_B-t\choose B-l_B}\\ \end{aligned} \]

\(\mathcal{B}_t(z)\) 提取系数(\(\mathcal{[z^n]\frac{B_t(z)^r}{1-t+tB_t^{-1}(z)}}={tn+r\choose n}\)):

\[\begin{aligned} &\sum_{l_B}\sum_{d\geq 1}\sum_{0\leq t\leq R-dB}{(d+1)l_B+t\choose l_B}{B+R-(d+1)l_B-t\choose B-l_B}\\ =&\sum_{l_B}\sum_{d\geq 1}\sum_{0\leq t\leq R-dB}\left([z^{l_B}]\frac{\mathcal{B}_{d+1}(z)^t}{(d+1)\mathcal{B}_{d+1}^{-1}(z)-d}\right)\left([z^{B-l_B}]\frac{\mathcal{B}_{d+1}(z)^{R-dB-t}}{(d+1)\mathcal{B}_{d+1}^{-1}(z)-d}\right)\\ =&\sum_{d\geq 1}(R-dB+1)\left([z^{B}]\frac{\mathcal{B}_{d+1}(z)^{R-dB}}{((d+1)\mathcal{B}_{d+1}^{-1}(z)-d)^2}\right)\\ \end{aligned} \]

\(F(z)+1=\mathcal{B}_{d+1}(z)\),那么 \(\mathcal{\frac{B_{d+1}(z)^{R-dB}}{((d+1)B_{d+1}^{-1}(z)-d)^2}}\) 等价于 \(\frac{(1+F(z))^{R-dB+2}}{(1-dF(z))^2}\) 。用另类拉格朗日反演提取系数:

\[\begin{aligned} [z^B]\frac{(1+F(z))^{R-dB+2}}{(1-dF(z))^2}&=[z^B]\frac{(1+z)^{R-dB+2}}{(1-dz)^2}\frac{(1-dz)}{(z+1)^{d+2}}\left(z+1\right)^{(d+1)(B+1)}\\ &=[z^B]\frac{(1+z)^{R+B+1}}{1-dz}=\sum_{0\leq i\leq B}{R+B+1\choose i}d^{B-i}\\ \end{aligned} \]

代回去:

\[\begin{aligned} \sum_{0\leq i\leq B}{R+B+1\choose i}\left((R+1)\sum_{1\leq d\leq \lfloor{\frac{R}{B}\rfloor}}d^{B-i}-B\sum_{1\leq d\leq \lfloor{\frac{R}{B}\rfloor}}d^{B-i+1}\right)\\ \end{aligned} \]

是自然数幂和。即 \(\sum\limits_{i=1}^{n}i^k=[\frac{x^k}{k!}]\frac{e^{x}-e^{(n+1)x}}{1-e^x}\) 即可。

时间复杂度 \(O(B\log B)\)
提交记录:Submission #97802 - QOJ.ac

D. Do Use FFT

\(\sum\limits_{1\leq i\leq n}\left(C_i\times \prod\limits_{1\leq j\leq k}(A_i+B_j)\right)\) 。考虑令 \(F_k(x)=\prod (x+B_j),G(x)=\sum \frac{C_i}{1-A_ix}\),那么 \(ans_k=[x^0]F_k(\frac{1}{x})G(x)\)

先分治求出 \(G(x)\) 。然后考虑分治求 \(ans_k\) 。在分治 \(\mathbf{divide}(x,l,r)\) 过程中,记 \(G_{x,l,r}(x)\) 为已经得到的结果,那么 \(G_{x,l,r}(x)\) 的最高次不超过 \(x^{r-l+1}\) 。往左儿子只要丢到后续无用项,然后递归。往右儿子只要在考虑左儿子后,丢掉无用项,然后递归。考虑左儿子的就是减法卷积。

时间复杂度 \(O(n\log^2 n)\)
提交记录:Submission #97807 - QOJ.ac

E. Edge Subsets

考虑将点放在平面上,对于 \(i\) 放在 \((x,y)\) 满足 \(x=\lfloor\frac{i}{B}\rfloor,y=\frac{i}{A}\bmod B\)(我们认为 \(\gcd(A,B)=1\),显然可以分组做)那么每次转移,如果走 \(B\) 的边就是横着走,如果走 \(A\) 的边要么走到下一行,要么走到斜下方。

于是有两种做法:第一种是竖着扫,记录轮廓线,状态数 \(2^{B}\);第二种是横着扫,记录轮廓线以及首行状态(因为最后一行会转移到首行),状态数 \(2^{2\lfloor\frac{n}{B}\rfloor}\) 。两个匀一下做到状态数不超过 \(2^{\sqrt{2n}}\)

时间复杂度 \(O(n2^{\sqrt{2n}})\)

F. Find the LCA

考虑 \(x\) 子树内部的构成,我们要减去的是每个子树的平方和,这和 \(\prod a\) 是不联系的。于是求出 \(g_i\) 表示 \(i\) 个点的 \(\prod a\) 和,在乘上 \(x\) 连边的方案数(\(x=1\) 比较特别,单独考虑)。

然后令 \(f_i\) 表示 \(i\) 个点树的方案数,乘平方和。这个拆开 exp 就行了。

时间复杂度 \(O(n\log^2 n)\)
提交记录:Submission #98626 - QOJ.ac

G. Games

K-nim,那么维度最多是 \(7\),每一维是 \([0,6]\) 。因为存在 \(\omega_{7}\),插入一个数时在每一维 DFT 一下。最后得到的就是 FWT 之后的结果,只要求出每位 \(k\) 次方求和就行了。

时间复杂度 \(O(b^b\log p+nb^{b+1})\)\(b=7\)
提交记录:Submission #98628 - QOJ.ac

H. Harsh Comments

根据期望线性性算每个 \(B_i\) 的答案。要求 \(B_i\) 在所有 \(A_i\) 后的概率,可以直接容斥。

时间复杂度 \(O((n+m)\sum a)\)

I. Inverse Problem

签到题就不做了。

J. Japanese Knowledge

我们构造新问题与原问题等价:

  • 给定一个栈,按照值域扫描线,每次 Push 。遇见某个 \(A_i\) 可以 Pop 任意个数,如果此时栈空了,则称这次 Pop 是优秀的。
  • 可以发现最后恰好 \(k\) 次优秀 Pop 对应了原问题 \(k\)\(x_i=A_i\) 的答案:将 Push 看成使 \(A_i-x_i\) 加一即可。

考虑将问题反过来:

  • 给定一个栈,按照值域扫描线,遇见某个 \(A_i\) 就 Push 。每次 Pop 任意个数。
  • 可以发现最后栈中恰好剩下 \(k\) 个数的方案数,对应了原问题 \(k\)\(x_i=A_i\) 的答案:每次值域往下扫,就是将已经离栈的元素集体减一,并决定一些元素脱离上界。

exactly 太强了,改成 at least:因为反向问题中,最后一个肯定是 Pop 。不妨将最后一步去掉,算 \(\geq k\) 个元素的方案数。这个和 \(\forall i\in[k+1, n],x_i< A_i\) 的所有合法方案一一对应:我们无非就是去掉了原先的最后 \(k\) 个 Push 。因为任意方案满足栈大小 \(\geq 0\),所以加回 \(k\) 个 Push 保证了栈大小 \(\geq k\)

于是问题得到转化。剩下的问题考虑分治解决:看成一个表格,那么要统计的是底下的线上每个点,到右侧线上的路径数。我们考虑按照 \(A_{mid}\) 分成三个部分,递归时给每个右侧线上点带一个系数(继续往后走的方案数)。

那么先递归右上侧,求答案。中间的部分通过卷积求出左侧线和底下的线的答案,系数是组合数。然后拿中间部分求出的左侧线答案,去递归左下侧即可。

时间复杂度 \(O(n\log^2 n)\)