1 条题解

  • 0
    @ 2025-11-11 18:20:49

    问题分析

    我们有一个 (L+1)×n(L+1) \times n 的有向图,顶点用 (u,v)(u, v) 表示,其中 0uL0 \le u \le L1vn1 \le v \le n。图的边权规则为:

    • u1<u2u_1 < u_2,则从 (u1,v1)(u_1, v_1)(u2,v2)(u_2, v_2)w(v1,v2)w(v_1, v_2) 条边
    • 否则没有边

    白兔从 (0,x)(0, x) 出发,每次沿任意出边跳到下一顶点,可在任意时刻停止(到达 u=Lu = L 时必须停止)。要求对每个 t[0,k)t \in [0, k),计算满足以下条件的舞曲数量(模 pp):

    • 舞曲长度 mmodk=tm \bmod k = t
    • 最终停在顶点 (u,y)(u, y)uu 任意)

    核心思路

    1. 矩阵建模

    AAn×nn \times n 的边权矩阵,Aij=w(i,j)A_{ij} = w(i, j)。从 (0,x)(0, x) 到任意 (u,y)(u, y) 的路径数为 (Au)x,y(A^u)_{x,y}。由于可以在任意 uLu \le L 停止,总方案数为:

    F=u=0LAuF = \sum_{u=0}^L A^u

    我们需要 Fx,yF_{x,y} 中路径长度 mm(即 uu)模 kktt 的部分。

    2. 单位根反演

    利用单位根反演公式:

    $$[m \bmod k = t] = \frac{1}{k} \sum_{j=0}^{k-1} \omega^{-jt} \omega^{jm} $$

    其中 ω\omega 是模 ppkk 次单位根(由 kp1k \mid p-1 保证存在)。

    于是:

    $$\text{Ans}_t = \frac{1}{k} \sum_{j=0}^{k-1} \omega^{-jt} \left( \sum_{u=0}^L \omega^{ju} A^u \right)_{x,y} $$

    3. 矩阵求和处理

    Mj=I+ωjAM_j = I + \omega^j A,则 Bj=MjLB_j = M_j^L 包含了从 u=0u=0u=Lu=L 的所有路径,因为每一步可以选择"停止"或"继续"。

    算法实现

    1. 寻找单位根

    通过分解 p1p-1 的质因数,找到原根 gg,然后计算 ω=g(p1)/k\omega = g^{(p-1)/k} 作为 kk 次单位根。

    2. 计算 f[j]f[j]

    根据 nn 的大小分别处理:

    • n=1n = 1:直接数论计算 (1+ωjA)L(1 + \omega^j A)^L
    • n=2,3n = 2, 3:构造矩阵 Mj=I+ωjAM_j = I + \omega^j A,通过矩阵快速幂计算 MjLM_j^L

    3. 单位根反演

    使用 MTT(拆系数FFT)实现卷积计算:

    • 将数字拆分为低位和高位两部分
    • 在复数域进行 FFT
    • 合并结果并取模

    4. 主流程

    1. 寻找单位根 ω\omega
    2. 对每个 j=0k1j = 0 \dots k-1 计算 f[j]=(MjL)x,yf[j] = (M_j^L)_{x,y}
    3. 预处理 ω\omega 的幂次
    4. 通过单位根反演计算每个 tt 的答案

    关键优化

    1. 矩阵快速幂:利用 n3n \leq 3 的特点,手写 2×22\times 23×33\times 3 矩阵运算
    2. MTT 优化:避免直接高精度计算,通过复数域 FFT 计算模 pp 卷积
    3. 预处理:预先计算 ω\omega 的幂次,减少重复计算

    复杂度分析

    • 矩阵计算O(kn3logL)O(k \cdot n^3 \log L)
    • 卷积计算O(klogk)O(k \log k)
    • 空间复杂度O(k)O(k)

    总结

    本题是一个结合了图论、矩阵和生成函数的综合问题,主要考察以下知识点:

    1. 矩阵建模:将图上的路径计数问题转化为矩阵幂次和
    2. 单位根反演:处理模 kk 余数约束的经典技巧
    3. 原根与单位根:在模意义下进行离散傅里叶变换
    4. MTT 算法:解决任意模数下的卷积计算
    5. 矩阵快速幂:高效计算矩阵的高次幂
    • 1

    信息

    ID
    5251
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者