1 条题解
-
0
问题分析
我们有一个 的有向图,顶点用 表示,其中 ,。图的边权规则为:
- 若 ,则从 到 有 条边
- 否则没有边
白兔从 出发,每次沿任意出边跳到下一顶点,可在任意时刻停止(到达 时必须停止)。要求对每个 ,计算满足以下条件的舞曲数量(模 ):
- 舞曲长度
- 最终停在顶点 ( 任意)
核心思路
1. 矩阵建模
设 是 的边权矩阵,。从 到任意 的路径数为 。由于可以在任意 停止,总方案数为:
我们需要 中路径长度 (即 )模 为 的部分。
2. 单位根反演
利用单位根反演公式:
$$[m \bmod k = t] = \frac{1}{k} \sum_{j=0}^{k-1} \omega^{-jt} \omega^{jm} $$其中 是模 的 次单位根(由 保证存在)。
于是:
$$\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. 矩阵求和处理
令 ,则 包含了从 到 的所有路径,因为每一步可以选择"停止"或"继续"。
算法实现
1. 寻找单位根
通过分解 的质因数,找到原根 ,然后计算 作为 次单位根。
2. 计算
根据 的大小分别处理:
- :直接数论计算
- :构造矩阵 ,通过矩阵快速幂计算
3. 单位根反演
使用 MTT(拆系数FFT)实现卷积计算:
- 将数字拆分为低位和高位两部分
- 在复数域进行 FFT
- 合并结果并取模
4. 主流程
- 寻找单位根
- 对每个 计算
- 预处理 的幂次
- 通过单位根反演计算每个 的答案
关键优化
- 矩阵快速幂:利用 的特点,手写 和 矩阵运算
- MTT 优化:避免直接高精度计算,通过复数域 FFT 计算模 卷积
- 预处理:预先计算 的幂次,减少重复计算
复杂度分析
- 矩阵计算:
- 卷积计算:
- 空间复杂度:
总结
本题是一个结合了图论、矩阵和生成函数的综合问题,主要考察以下知识点:
- 矩阵建模:将图上的路径计数问题转化为矩阵幂次和
- 单位根反演:处理模 余数约束的经典技巧
- 原根与单位根:在模意义下进行离散傅里叶变换
- MTT 算法:解决任意模数下的卷积计算
- 矩阵快速幂:高效计算矩阵的高次幂
- 1
信息
- ID
- 5251
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者