专栏文章

FPS 24题

算法·理论参与者 3已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@mi4dd2is
此快照首次捕获于
2025/11/18 17:26
3 个月前
此快照最后确认于
2025/12/02 00:10
3 个月前
查看原文
喜欢多项式/se/se/se
https://atcoder.jp/contests/fps-24
默认读者已经掌握 多项式学习笔记多项式进阶——生成函数 GF 与集合幂级数 中的知识。(如果对本文的某些专有名词感到困惑,可以去这两篇文章找找)
本文中 FF 均表示 OGF,F^\hat F 表示 EGF,fif_i 表示 FF 的各项系数。

A

[xn](x+x3+x4+x6)d[x^n](x+x^3+x^4+x^6)^d

B

[xn](1+x)(1+x+x2)11x211x3[x^n](1+x)(1+x+x^2)\frac1{1-x^2}\frac1{1-x^3}
化简得到 [xn]1(1x)2=n+1[x^n]\frac1{(1-x)^2}=n+1

C

[xs](1xm+11x)n[x^s]\left(\frac{1-x^{m+1}}{1-x}\right)^n

D

显然每个数都不相同,所以只需对升序序列计数,答案 ×n!\times n! 即可。
对于升序序列,可以考虑他们的差分:
k=0n[xk]1xm+11x(x1x2)n1\sum_{k=0}^n[x^k]\frac{1-x^{m+1}}{1-x}\left(\frac x{1-x^2}\right)^{n-1}

E

怎么混入了一个基础背包练习题。

F

[xnn!]ixii!j2xjj!k2xkk!=[xnn!]exex+ex2exex2=14[xnn!]e3xex=3n(1)n4\begin{aligned} &\left[\frac{x^n}{n!}\right]\sum_{i}\frac{x^i}{i!}\sum_{j\mid2}\frac{x^j}{j!}\sum_{k\nmid2}\frac{x^k}{k!}\\ =&\left[\frac{x^n}{n!}\right]e^x\frac{e^x+e^{-x}}2\frac{e^x-e^{-x}}2\\ =&\frac14\left[\frac{x^n}{n!}\right]e^{3x}-e^{-x}\\ =&\frac{3^n-(-1)^n}4 \end{aligned}

G

怎么混入了一个进阶背包练习题。
按照 LL 分块,预处理前后缀背包,询问的话 merge 两个背包即可。

H

注意到 a{0,1}a\in\{0,1\},考虑按 xx 分阶段算。
a=0a=0 时,设此时的生成函数为 FF,容易得到:
F=11x1x=1x12xF=\frac1{1-\frac x{1-x}}=\frac{1-x}{1-2x}
a=1a=1 时,设这一步的生成函数为 GG,容易得到:
G=11xG=\frac{1}{1-x}
答案为 [xm]F(GF)n=[xm]1x(12x)n+1[x^m]F(GF)^n=[x^m]\dfrac{1-x}{(1-2x)^{n+1}}

I

[xk]in(1+aix)[x^k]\prod_i^n(1+a_ix)

J

设走到 ii 的概率为 fif_i,转移为:
fn=i=1mfnaif_n=\sum_{i=1}^mf_{n-a_i}
分治 NTT 优化 DP,走到不合法的位置时将 dp 值改为 00 即可。
有一个坑是当前位置会和 nnmin\min,注意一下。

K

fif_i 表示确定了 p1pip_1\sim p_iii 作为第一个满足 max(p1,p2pi)=i\max(p_1,p_2\dots p_i)=i 的位置,对应的方案数。那么有:
n!=i=1nfi(ni)!n!=\sum_{i=1}^nf_i(n-i)!
gi=i!g_i=i!,可以得到 G=FG+1G=FG+1F=11GF=1-\dfrac1G

L

限制等价于每个环长不小于 33
对于单个环,容易得到 i3,fi=(i1)!\forall i\ge3,f_i=(i-1)!
把多个环组合起来就是 exp(F^)\exp(\hat F)

M

原,略。

N

对于价值为 ii 的硬币,容易得到生成函数为:
Fi=1xi(ai+1)1xiF_i=\frac{1-x^{i(a_i+1)}}{1-x^i}
答案即为 F\prod F
发现这个东西其实就是付公主的背包,于是可以在 O(nlogn)O(n\log n) 时间内求得 lnF\sum\ln F

O

看到树及其 deg\deg,考虑 prufer 序。那么得到,每个点在 prufer 序中必须出现 00 或质数次。(11 号点需要特判)
PP 表示素数组成的多项式,即:
P=i=0oriprimexiP=\sum\limits_{i=0\operatorname{or}i\in\texttt{prime}}x^i
2n2\sim n 的贡献为 (P^)n1(\hat P)^{n-1}

P

f(x)=i=0kxnif(x)=\sum_{i=0}^kx^{n-i}
所求即为 f(1),f(2)f(m)f(1),f(2)\dots f(m),多项式多点求值即可。

Q

先把期望转为总和。
fd=i=1naidgd=i=1mbidAns^=F^×G^f_d=\sum_{i=1}^na_i^d\\g_d=\sum_{i=1}^mb_i^d\\\hat{Ans}=\hat F\times\hat G
接下来考虑如何计算 F,GF,G。这两个是等价的,以 FF 为例:
F=i=1nj=1(aix)j=i=1n11aixF=\sum_{i=1}^n\sum_{j=1}(a_ix)^j=\sum_{i=1}^n\frac1{1-a_ix}
分治 NTT 即可。

R

一般的 dp 为 fi,j=12(fi1,j1+fi1,j+1)f_{i,j}=\frac12(f_{i-1,j-1}+f_{i-1,j+1}),但是最左侧与最右侧很讨厌。尝试通过一些手法使得左右端点可以相同转移,容易想到镜像法。具体来说,将序列扩充为 0,12n1,2n,2n12,10,1\dots2^n-1,2^n,2^n-1\dots2,1(将下标平移了),将首尾连成一个环。此时,每个元素的 dp 值都可以由相邻元素的平均值得到。
于是 F0=1,Fi=12Fi1(x+1x)F_0=1,F_i=\frac12F_{i-1}(x+\frac1x),答案即为 [xX]FT[x^X]F_T。注意到我们所需的是循环卷积,而本题特意保证了项数是 22 的幂次,于是 mod(2n+11)\bmod(2^{n+1}-1) 可以在 O(nlogn)O(n\log n) 的复杂度内解决。

S

首先明确树上博弈的必胜条件。显然树是一个二分图,于是先手必胜当且仅当初始点位于每一个最大匹配中(有一个坑是这道题询问的是 Alice 必胜,为后手)。那么 type=1type=1 等价于判断 11 号点是否可以不在最大匹配中,type=2type=2 等价于判断是否存在点可以不在最大匹配中。

type=1

AA 表示 Alice 必胜的 GF,BB 表示 Bob 必胜的 GF。(都是在有根树中,因为本题限定根节点为 11,答案 ×1n\times\frac1n 即可)
A=xexpBB=xexp(A+B)AA=x\exp B\\B=x\exp(A+B)-A
消元,得到关于 BB 的等式:
B=x(exp(xexpB+B)expB)B=x(\exp(x\exp B+B)-\exp B)
牛顿迭代即可做到单 log\log 复杂度。

type=2

其实是诈骗。注意到问题等价于判断是否存在完美匹配,而对于一棵树如果存在完美匹配的话匹配方式唯一。
于是可以先生成一个完美匹配,方案数 n!(n2)!2n2\dfrac{n!}{(\frac n2)!2^{\frac n2}},然后把这些大小为 22 的联通块连起来,方案数 2n2nn222^{\frac n2}n^{\frac n2-2}

T

对于一个颜色序列 c0=1,c1cT1,cT=1c_0=1,c_1\dots c_{T-1},c_T=1,其贡献为 i=1T1aci\prod\limits_{i=1}^{T-1}a_{c_i}。现在需要对所有可能的颜色序列求和。
考虑容斥。首先明确,一共有 TT 个相邻位置,如果钦定有 cntcnt 个相邻位置的颜色一样,则容斥系数为 (1)cnt(-1)^{cnt}
显然开头结尾比较特殊(颜色已经确定且不带权),先考虑较为普通的中间段(一段内部的颜色相同)。容易写出其生成函数为:
F=i=1naix1+aixF=\sum_{i=1}^n\frac{a_ix}{1+a_ix}
加上开头结尾的贡献,于是答案为:
a1T1×(1)T+[xT1](11+a1x)21Fa_1^{T-1}\times(-1)^T+[x^{T-1}]\frac{(\frac1{1+a_1x})^2}{1-F}
生成函数的分子是在枚举开头结尾段的长度,但是发现这样会忘记钦定 cnt=Tcnt=T,于是在前面补上。
问题在于 TT 太大了,不能直接多项式求逆做。化简,发现可以写成 QP\frac QP,其中 QQ 是一个 nn 次式,PP 是一个 n+2n+2 次式。于是这等价于一个 n+2n+2 阶线性递推,上一个模板即可。
注:请注意线性递推部分的常数,建议使用 EI 文章中的新·线性递推。本人使用的是老算法,即快速幂 + 多项式取模,一个卡常技巧是注意到模数是不变的,可以把多项式取模模板中只关于模数的部分预处理(主要是多项式求逆)。

U

难点在于写出一份 O(n2)O(n^2) 的暴(正)力(解)。
考虑如何判定一个方案是否可行——扫描每一个时间段,如果该段被覆盖了 >2>2 次则非法。充要性较为显然,此处不再证明。于是可以 fi,j,0/1/2f_{i,j,0/1/2} 表示扫描到了第 ii 时间段,已经用过了 jj 个区间,目前有多少个区间覆盖当前时间段。转移是 O(1)O(1) 的,如果从大到小扫描 jj 的话,还可以把 ii 删掉。
看到后面的 0/1/20/1/2,容易联想到矩阵乘法,发现每次转移的矩阵相同:(把 jj 当做多项式中的次数)
[Fi,0Fi,1Fi,2]×[1xx2201x001]×[100110121]=[Fi+1,0Fi+1,1Fi+1,2]\begin{bmatrix}F_{i,0}&F_{i,1}&F_{i,2}\end{bmatrix}\times\begin{bmatrix}1&x&\frac{x^2}2\\0&1&x\\0&0&1\end{bmatrix}\times\begin{bmatrix}1&0&0\\1&1&0\\1&2&1\end{bmatrix}=\begin{bmatrix}F_{i+1,0}&F_{i+1,1}&F_{i+1,2}\end{bmatrix}
分治 NTT 维护矩阵乘法即可。这是因为一个时间段最多让 xx 的次数增加 22,而我们只需要 [xn][x^n] 的值,因此我们只需要保留 O(2×len)O(2\times len) 的项数。
题解区有线性做法,大概是只保留末尾的 O(1)O(1) 项进行转移。
【另解】
注意到这是一个大小 3×33\times3,且每个元素都是一个多项式的矩阵乘法。并且由于外层套一个分治 NTT,能够感觉到这道题是一个超大常 O(nlog2n)O(n\log^2n),这也是为何在数据范围并不大的情况下本题的时间限制为 12s12s。合理猜测,一份小常 O(n2)O(n^2) 代码并不会劣于该算法,于是对暴力 DP 稍加卡常即可通过。
AC 记录:https://atcoder.jp/contests/fps-24/submissions/70703973

V

感觉官方题解写得很清晰啊,抄一下
显然坐标不能只用整数表示,需要扩域到 32\frac{\sqrt3}2 上,于是不妨设当前坐标为 (a+3b2,c+3d2)(\frac{a+\sqrt3b}2,\frac{c+\sqrt3d}2),用 xaybzcsdx^ay^bz^cs^d 表示。那么所求可以写成:
[x2Hy0z2Ws0](x2+x2+z2+z2+(x+x1)(s+s1)+(y+y1)(z+z1))n[x^{2H}y^0z^{2W}s^0]\left(x^2+x^{-2}+z^2+z^{-2}+(x+x^{-1})(s+s^{-1})+(y+y^{-1})(z+z^{-1})\right)^n
这东西同时出现了二次项和一次项,考虑用我们小学一年级就学过的方法全部转化为一次。设 X=x+x1X=x+x^{-1},其余各项同理:
(X22+Z22+XS+YZ)n=(X(X+S)+Z(Z+Y)4)n(X^2-2+Z^2-2+XS+YZ)^n=(X(X+S)+Z(Z+Y)-4)^n
这两部分独立,只需解决 [x2Hs0](X(X+S))k[x^{2H}s^0](X(X+S))^k,即可轻松解决原问题。
x=pq,s=pqx=pq,s=\frac pq,简单推下式子:
[x2Hs0]((x+x1)(x+x1+s+s1))k=[p2Hq2H]((pq+(pq)1)(pq+(pq)1+pq1+p1q))k=[p2Hq2H](pq+(pq)1)k(p+p1)k(q+q1)k=i=0k(ki)(kHi+k)2\begin{aligned} &[x^{2H}s^0]((x+x^{-1})(x+x^{-1}+s+s^{-1}))^k\\ =&[p^{2H}q^{2H}]((pq+(pq)^{-1})(pq+(pq)^{-1}+pq^{-1}+p^{-1}q))^k\\ =&[p^{2H}q^{2H}](pq+(pq)^{-1})^k(p+p^{-1})^k(q+q^{-1})^k\\ =&\sum_{i=0}^k\binom ki\binom k{H-i+k}^2 \end{aligned}
于是可以通过一次卷积求出 k=0nk=0\sim n 上述问题的答案。

W

不太会啊……

X

不太会啊……

评论

2 条评论,欢迎与作者交流。

正在加载评论...