望月者计划
望月者计划's 题解 for jimmy0926
1. 问题建模:从决策序列到能量路径
用变量 c0, c1, …, cn−1 ∈ {0,1} 表示在每个单位时间节点是否增强(1 增强,0 不增强)。
- 题目要求 c0 = 1(初始能量为 0 必须增强),其余 ci 可选。
- 增强后能量立即 +m,随后每传递 1 单位时间能量 −1。
定义能量序列 Ei:经过前 i 个节点决策并消耗后的能量:
- E0 = 0,增强 c0=1 后消耗,得 E1 = m − 1。
- 对 i ≥ 1:
- 若 ci = 1:Ei+1 = Ei + m − 1。
- 若 ci = 0:Ei+1 = Ei − 1。
合法条件等价于能量始终非负:Ei ≥ 0 对所有 i = 1, …, n 成立。能量为 0 时必须增强的规则自动被非负条件涵盖。
2. 总方案数与非法方案
若忽略所有约束,每个节点可选 0 或 1,共 2n 种原始赋值。合法方案数 = 2n − 非法方案数。
首次违规分析
对于非法路径,存在最小的 v ≥ 1 满足 Ev < 0。由于每步至多下降 1,必有 Ev = −1,且 Ev−1 = 0,导致违规的决策是 cv−1 = 0。
由能量递推得 Ev−1 = m · Tv−1 − (v−1) = 0,因此 v−1 必须是 m 的倍数,记为 v−1 = m k,于是 v = m k + 1,且前 v−1 步恰好有 k 次增强。首次违规时刻固定为 j = m k + 1,前缀路径能量非负且终值为 0,第 j 步决策为 0,之后可任意。
3. 前缀序列计数与广义卡特兰数
长度为 L = m k 的前缀序列要求:E0 = 0,Ei ≥ 0,EL = 0,首决策必增强,共 k 次增强和 m k 次消耗。该类序列的计数为广义卡特兰数(Fuss–Catalan 数):
Cm(k) = 1⁄m k + 1 (m k + 1k).
该公式可由 Raney 引理(Cycle Lemma)推导:考虑在末尾补一个 −1,反转符号,得到和为 +1 的序列,循环位移中恰有一个前缀和为正,通过双射得出计数。
4. 非法方案求和与合法方案公式
非法方案总数 = ∑k ≥ 0, m k+1 ≤ n 2n − (m k+1) · 1⁄m k+1 (m k+1k).
因此合法方案数:
ans = 2n − ∑k ≥ 0, m k+1 ≤ n 2n − (m k+1) · 1⁄m k+1 (m k+1k).
5. 代码实现细节
ll ans = pw2[n]; // 总方案数 2^n
for (ll k = 0; ; ++k) {
ll j = (ll)m * k + 1; // 首次违规时刻 v
if (j > n) break;
ll invj = inv_fact[j] * fact[j-1] % mod; // 逆元 1/j
ll term = pw2[n - j] * C(j, k) % mod * invj % mod;
ans = (ans - term + mod) % mod;
}
fact与inv_fact预处理阶乘及其逆元,用于 O(1) 计算组合数。invj利用 j! / j = (j−1)! 的性质在模意义下求逆元。pw2预处理 2 的幂次。- 循环终止条件保证只处理合法的 k。
- 时间复杂度 O(n/m),最坏 O(n),完全可承受。
总结
本题采用 全集 − 非法集 的容斥框架,通过首次违规时刻分类,利用 Raney 引理得到每类非法前缀的计数为广义卡特兰数,从而转化为简洁的数学公式。整个过程严谨高效,完美解决了问题。
更好理解的,Fuss-Catalan 数将“在矩阵中不超过对角线走法的方案数”扩展为“在坐标系中超过半轴走法的总方案数”。

浙公网安备 33010602011771号