题面有点长,而且还不好解释,所以不放简要题面了。
链接
前言
2019 年 4 月 7 日,HNOI2019 Day 2 赛场上,菜鸡 Karry5307 打了这题的 50 分部分分做法,可是下午出成绩的时候发现本题 boom 0。
2019 年 7 月,菜鸡 Karry5307 看到了 memset0 的题解,但是由于太菜,并没有看懂。
2019 年 10 月,菜鸡 Karry5307 学习了单位根反演,可是并没有学出什么所以然。
2019 年 11 月,菜鸡 Karry5307 学习了 MTT,第一次失败了,但是最终还是成功的通过了 Luogu 的模板题。
2020 年 1 月 21 日,菜鸡 Karry5307 成功 AC CF1286F,多项式 16 题只剩下 CF 901E 了,但是 CF901E 由于需要用到 Bluestein’s Algorithm,所以他放弃了。
2020 年 2 月 27 日,菜鸡 Karry5307 看到神仙 x义x 讨论性能优化那题,发现 x义x 会 Bluestein’s Algorithm 而自己不会。
2020 年 3 月 2 日,菜鸡 Karry5307 最终还是学习了 Bluestein’s Algorithm,并且在 30min 切掉此题。
一年前我在 HNOI2019 的赛场上,折戟沉沙。一年后,我从倒下的地方爬起。
我成功了。我不再是以前的那个我了。
题解
首先来看一个很傻逼的 $\texttt{dp}$。
考虑 $f_{i,j}$ 表示走 $i$ 步到第 $j$ 行的任意合法位置的方案数,$g_{i,j}$ 表示走 $i$ 步到第 $j$ 行的方案数(注意这里并没有钦定在哪个位置上)。
转移比较显然,枚举一下上一次在哪一行,有
然后注意到行数比较小,所以可以使用矩阵优化。
一开始初始矩阵是 $G_0=\begin{pmatrix}1&0&0\end{pmatrix}$(相当于白兔在第一行),转移矩阵是
所以 $G_i=\begin{pmatrix}g_{i,1}&\cdots&g_{i,n}\end{pmatrix}=G_0S^i$。
那么 $f_{i,j}$ 等价于白兔在 $1$ 到 $L$ 中选择 $i$ 个经过点进行跳舞,所以有
所以我们要求的是
发现这个不太好搞定,所以移项。
然后就是套路单位根反演。
然后把 $k$ 提出来,单位根的括号拆掉,有
交换一下求和符号就可以把单位根提出来了,顺便把之前的 $\texttt{dp}$ 式子代进来所以
也就是说,我们要求
的第 $y$ 项,也即
然后发现是个二项式定理。更加形式化的来讲,是这样的
所以
后面这一坨可以矩阵快速幂。
设 $h_{j}=G_0(\omega_{k}^{j}S+I)^L$ 的第 $y$ 项,那么
如果熟悉任意长度循环卷积的套路的话可以考虑 $\texttt{Bluestein’s Algorithm}$。
但是如果把 $ij$ 拆成 $\frac{(i+j)^2}{2}-\frac{j^2}{2}-\frac{j^2}{2}$ 的话会出现一个问题,在模意义下没有二次剩余。
所以考虑把 $ij$ 拆成 $\binom{i+j}{2}-\binom{i}{2}-\binom{j}{2}$。
比较显然,拆开就可以了,所以有
把一些奇奇怪怪的东西提到外面去
然后设 $f_j=h_j\omega_{k}^{\binom{j}{2}},g_j=\omega_k^{-\binom{t+j}{2}}$,有
这个随便搞搞就可以了,可以倍长也可以先 reverse 一下卷完 reverse 回来。
注意到,在模意义下的单位根是原根,所以要先求出原根,最后 MTT 即可。
代码
1 |
|