其他分享
首页 > 其他分享> > [HNOI2019] 白兔之舞

[HNOI2019] 白兔之舞

作者:互联网

Problem

有一张顶点数为 \((L+1)\times n\) 的有向图,每个节点用二元组 \((u,v)\) 来表示(\(0\le u\le L,1\le v\le n\)),节点 \((u_1,v_1)\) 到 \((u_2,v_2)\) 有 \(w_{v_1,v_2}\) 条不同的边,当且仅当 \(u_1<u_2\)。

初始时白兔在 \((0,x)\),每次沿着一条路跳到下一个节点,它可以在任意时刻停止(也可以在起点停止),或者第一维到达 \(L\) 也会停止。停止时白兔共跳了 \(m\) 步,第 \(i\) 个元素表示经过的第 \(i\) 条边。

给定 \(k\) 和 \(y(1\le y\le n)\),对于每个 \(t(0\le t<k)\),求有多少种舞曲(假设其长度为 \(m\))满足 \(m\bmod k=t\),且白兔最后停在了坐标第二维为 \(y\) 的顶点。答案对 \(p\)(一个质数)取模。

\(10^8<p<2^{30}\),\(1\le n\le 3\),\(1\le x,y\le n\),\(0\le w_{i,j}<p\),\(1\le k\le 65536\),\(k\mid p-1\),\(1\le L\le 10^8\)。

Sol

由题,我们写出来转移矩阵 \(A\)

\[A=\left[ \begin{matrix} w_{11}&\cdots&w_{n1}\\ \vdots&\ddots&\vdots\\ w_{1n}&\cdots&w_{nn}\\ \end{matrix} \right] \]

列向量 \(X\) 满足 \(X_x=1\),其余为 \(0\)。

发现第一维和第二维在某种意义上独立。

变换 \(m\) 次得到 \(A^mx\),取出来第 \(y\) 项乘上组合数 \(L\choose m\) 即为长度为 \(m\) 的舞曲的种类数。

假设我们只需要求出 \(m\bmod k=t\) 的答案和,不难想到 单位根反演

\[\begin{aligned} &\sum_{m=0}^L{L\choose m}A^m[m\bmod k=t]\\ =&\sum_{m=0}^L{L\choose m}A^m\sum_{j=0}^{k-1}\frac{w^{j(m-t)}}k\\ =&\frac1k\sum_{j=0}^{k-1}w^{-jt}\sum_{m=0}^L{L\choose m}w^{jm}A^m \end{aligned} \]

推导中暂时略去乘上的列向量 \(x\),只要最后补上去即可。注意到后半部分中相当于要求

\[\sum_{i=0}^n{n\choose i}A^i \]

由于 \(AI=IA=A\),满足 交换律,故可以使用二项式定理,得到

\[\frac1k\sum_{j=0}^{k-1}w^{-jt}(w^jA+I)^L \]

令 \(y_j=(w^jA+I)^Lx\) 的第 \(y\) 项,要求 \(t=j\) 时的答案,则上面式子可以看成

\[f(x)=\frac1k\sum_{j=0}^{k-1}y_jx^j \]

也就是说我们要依次求出来 \(f(w^0),f(w^{-1}),f(w^{-2}),\cdots\)。直接 NTT

但 \(k\not\equiv 2^l\),所以我们需要 Bluestein's Algorithm 来做任意长度的卷积,详见我的另一篇博文 Chirp Z-Transform

复杂度 \(\mathcal O(n^3k\log L+k\log k)\)。此题毒瘤还要 MTT

Code

标签:白兔,le,sum,cdots,choose,HNOI2019,之舞,frac1k
来源: https://www.cnblogs.com/ac-evil/p/14759349.html