望月者计划

 

望月者计划'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) = 1m k + 1 (m k + 1k).

该公式可由 Raney 引理(Cycle Lemma)推导:考虑在末尾补一个 −1,反转符号,得到和为 +1 的序列,循环位移中恰有一个前缀和为正,通过双射得出计数。

4. 非法方案求和与合法方案公式

非法方案总数 = k ≥ 0, m k+1 ≤ n 2n − (m k+1) · 1m k+1 (m k+1k).

因此合法方案数:

ans = 2nk ≥ 0, m k+1 ≤ n 2n − (m k+1) · 1m 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;
}
  • factinv_fact 预处理阶乘及其逆元,用于 O(1) 计算组合数。
  • invj 利用 j! / j = (j−1)! 的性质在模意义下求逆元。
  • pw2 预处理 2 的幂次。
  • 循环终止条件保证只处理合法的 k
  • 时间复杂度 O(n/m),最坏 O(n),完全可承受。

总结

本题采用 全集 − 非法集 的容斥框架,通过首次违规时刻分类,利用 Raney 引理得到每类非法前缀的计数为广义卡特兰数,从而转化为简洁的数学公式。整个过程严谨高效,完美解决了问题。

更好理解的,Fuss-Catalan 数将“在矩阵中不超过对角线走法的方案数”扩展为“在坐标系中超过半轴走法的总方案数”。

posted @ 2026-07-21 13:25  Ryan_L_F  阅读(1)  评论(0)    收藏  举报