Luogu5293

前言

我是卡老师,我 10min IP 赋,30min 贺白兔之舞!

联赛前单走一个多项式颓废记录。

刚学的 CZT,趁着热乎过来切白兔之舞并写篇题解。


思路

\(f_{i,j}\) 表示白兔选 \(i\) 个落脚点,最后一步所对应的第二维坐标是 \(j\) 的方案数,而另设 \(g\) 使 \(f_{i,j}=\binom Lig_{i,j}\),即 \(g\) 表示选完 \(i\) 个落脚点后的答案。

那么我们得到一个很 naive 的 dp 式:

\[g_{i,j}=\sum_kg_{i-1,k}w_{k,j} \]

这个显然可以矩阵优化。

\(\vec g_i=(g_{ij})_ {1\times n}\),那么 \(\vec g_i=\vec g_{i-1}\cdot W\),其中 \(W_{n\times n}\) 为给定的矩阵。

那么,\(g_{i,j}=(W^i)_ {x,j}\)

或者说,\(\vec g_i\)\(W^i\) 的第 \(x\) 个行向量

那么,类似的,\(f_{i,j}=\binom Li g_{i,j}=\binom Li(W^i)_ {x,j}\)

\(w_k=g^{p-1\over k}\),即 \(w_k\)\(k\) 次单位根(\(g\)\(p\) 一个原根)。

作单位根反演。

\[ans_t=\sum_m[k\mid m-t]f_{m,y} \\=\sum_mf_{m,y} {\sum\limits_{i=0}^{k-1}w_k^{i(m-t)}\over k} \\=\dfrac1k\sum_{i=0}^{k-1}w_k^{-it}\sum_mw_k^{im}f_{m,y} \\=\dfrac1k\sum_{i=0}^{k-1}w_k^{-it}\sum_mw_k^{im}\binom Lm(W^m)_ {x,y} \\=\dfrac1k\sum_{i=0}^{k-1}w_k^{-it}(\sum_m\binom Lm(w_k^iW)^m)_ {x,y} \\=\dfrac1k\sum_{i=0}^{k-1}w_k^{-it}((I_n+w_k^iW)^L)_ {x,y}\]

(最后这步逆用了一次二项式定理,\(I_n\)\(n\) 阶单位矩阵)

对每个 \(i\),矩阵快速幂求出 \(h_i=((I_n+w_k^iW)^L)_ {x,y}\)

\[ans_t=\dfrac1k\sum_{i=0}^{k-1}w_k^{-it}h_i \]

来吧,CZT!

由于 \(it=\binom{i+t}2-\binom i2-\binom t2\),因此我们有

\[ans_t=\dfrac1k\sum_{i=0}^{k-1}w_k^{-it}h_i \\=\dfrac{w_k^\binom t2}k\sum_{i=0}^{k-1}w_k^{-\binom{i+t}2}(h_iw_k^{\binom i2})\]

一次差卷积。


关于差卷积

不会吧不会吧都爆切白兔之舞了肯定会 CZT 啊,会 CZT 还不会差卷积吗。

鉴于有的题解中只讲了 reverse 方法求差卷积而没有讲述差卷积的确切概念,补充一下。

数列 \(\{a_n\}\)\(\{b_n\}\) 的差卷积 \(\{c_n\}\) 表述为:

\[\forall0\le k\le n,c_k=\sum_ia_{i+k}b_i \]

做法就是设 \(d_i=b_{n-i}\),再假设 \(a\)\(d\) 用 FFT 卷成 \(C\),那么 \(c_k=\sum\limits_ia_{i+k}d_{n-i}=C_{n+k}\)

直观来看,就是\(b\) 翻转了后与 \(a\) 卷起来,再把系数平移。


复杂度分析

求单位根:\(O(\ ^4\!\!\!\!\sqrt p\log\log p)\)

预处理单位根幂次:\(\Theta(k+\log p)\)

矩阵快速幂:\(\Theta(kn^3\log L)\)

卷积:\(\Theta(k\log k)\)


Code

写的四次 FFT,和 KarryS307 的比了比,我的还快一点?

代码较长,放剪贴板了。

posted @ 2022-02-14 07:24  myee  阅读(113)  评论(0编辑  收藏  举报