1 条题解

  • 0
    @ 2026-8-28 1:36:44

    题解

    思路

    令 fnf_n 表示长度恰好为 nn 的合法序列数。观察最后一个块:它要么是一朵红花,要么是一组 kk 朵白花。因此

    fn=fn−1+[n≥k]fn−k。f_n=f_{n-1}+[n\ge k]f_{n-k}。

    空序列是拼接的起点,所以 f0=1f_0=1。所有运算均对 109+710^9+7 取模。

    做法

    先读入所有询问并记最大右端点 BB,按照递推式计算 f1,…,fBf_1,\ldots,f_B。再建立前缀和

    si=∑j=1ifj。s_i=\sum_{j=1}^{i} f_j。

    询问 [a,b][a,b] 的答案为 (sb−sa−1) mod (109+7)(s_b-s_{a-1})\bmod(10^9+7)。

    正确性证明

    对于任意长度为 nn 的合法序列,最后一个块只有两种互斥情况:

    • 最后是单朵红花。删去它后,得到任意一个长度为 n−1n-1 的合法序列,共 fn−1f_{n-1} 种;
    • 最后是连续 kk 朵白花。仅当 n≥kn\ge k 时可行,删去该块后得到任意一个长度为 n−kn-k 的合法序列,共 fn−kf_{n-k} 种。

    两类覆盖全部合法序列,因此递推式正确。前缀和 sb−sa−1s_b-s_{a-1} 恰好累加所有长度 aa 到 bb 的方案数,所以每个询问的输出正确。

    复杂度分析

    设所有询问的最大右端点为 BB。预处理时间复杂度 O(B)O(B),回答询问共需 O(t)O(t),空间复杂度 O(B)O(B)。

    • 1

    信息

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