Luogu5293
前言
我是卡老师,我 10min IP 赋,30min 贺白兔之舞!
联赛前单走一个多项式颓废记录。
刚学的 CZT,趁着热乎过来切白兔之舞并写篇题解。
思路
设 \(f_{i,j}\) 表示白兔选 \(i\) 个落脚点,最后一步所对应的第二维坐标是 \(j\) 的方案数,而另设 \(g\) 使 \(f_{i,j}=\binom Lig_{i,j}\),即 \(g\) 表示选完 \(i\) 个落脚点后的答案。
那么我们得到一个很 naive 的 dp 式:
这个显然可以矩阵优化。
记 \(\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\) 一个原根)。
作单位根反演。
(最后这步逆用了一次二项式定理,\(I_n\) 为 \(n\) 阶单位矩阵)
对每个 \(i\),矩阵快速幂求出 \(h_i=((I_n+w_k^iW)^L)_ {x,y}\)。
来吧,CZT!
由于 \(it=\binom{i+t}2-\binom i2-\binom t2\),因此我们有
一次差卷积。
关于差卷积
不会吧不会吧都爆切白兔之舞了肯定会 CZT 啊,会 CZT 还不会差卷积吗。
鉴于有的题解中只讲了 reverse 方法求差卷积而没有讲述差卷积的确切概念,补充一下。
数列 \(\{a_n\}\) 与 \(\{b_n\}\) 的差卷积 \(\{c_n\}\) 表述为:
做法就是设 \(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 的比了比,我的还快一点?
代码较长,放剪贴板了。
本文来自博客园,作者:myee,转载请注明原文链接:https://www.cnblogs.com/myee/p/Luogu-solution-p5293.html