1 条题解

  • 0
    @ 2025-12-11 1:14:57

    题解:礼物数列快速计算

    问题转化

    设第 ii 个朋友送的礼物数为 aia_i,根据题意有:

    a1=1a_1 = 1 $$a_{n+1} = \sum_{i=1}^{n} a_i + (n+1)^K \quad (n \ge 1) $$

    关键推导

    1. 简化递推

    Sn=i=1naiS_n = \sum_{i=1}^{n} a_i,则 an+1=Sn+(n+1)Ka_{n+1} = S_n + (n+1)^K,且 Sn+1=Sn+an+1S_{n+1} = S_n + a_{n+1}

    代入得:

    an+1=Sn+(n+1)Ka_{n+1} = S_n + (n+1)^K Sn+1=Sn+[Sn+(n+1)K]=2Sn+(n+1)KS_{n+1} = S_n + [S_n + (n+1)^K] = 2S_n + (n+1)^K

    2. 建立矩阵递推

    设状态向量为:

    $$X_n = \begin{bmatrix} S_n \\ n^K \\ n^{K-1} \\ \vdots \\ n^1 \\ 1 \end{bmatrix} $$

    需要将 XnX_n 递推到 Xn+1X_{n+1}

    多项式降幂关系

    (n+1)t=j=0t(tj)nj(n+1)^t = \sum_{j=0}^{t} \binom{t}{j} n^j

    对于 t=0,1,,Kt=0,1,\dots,K 有:

    (n+1)t=j=0tC(t,j)nj(n+1)^t = \sum_{j=0}^{t} C(t,j) \cdot n^j

    其中 C(t,j)=(tj)C(t,j) = \binom{t}{j}

    SS 的递推

    $$S_{n+1} = 2S_n + (n+1)^K = 2S_n + \sum_{j=0}^{K} C(K,j) n^j $$

    构造转移矩阵

    矩阵大小:(K+2)×(K+2)(K+2) \times (K+2)

    第一行对应 SS

    • SS 的系数:22
    • njn^j 的系数:C(K,j)C(K,j)(其中 0jK0 \le j \le K

    ii 行(i2i\ge 2)对应 (n+1)K+2i(n+1)^{K+2-i}: 设 t=K+2it = K+2-i,则:

    (n+1)t=j=0tC(t,j)nj(n+1)^t = \sum_{j=0}^{t} C(t,j) n^j

    因此该行在 njn^j 列上的系数为 C(t,j)C(t,j),其余为 00

    3. 矩阵形式

    MM 为转移矩阵:

    Xn+1=MXnX_{n+1} = M \cdot X_n

    具体形式:

    $$M = \begin{bmatrix} 2 & C(K,K) & C(K,K-1) & \cdots & C(K,0) \\ 0 & C(K,K) & C(K,K-1) & \cdots & C(K,0) \\ 0 & 0 & C(K-1,K-1) & \cdots & C(K-1,0) \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & 0 & \cdots & C(0,0) \end{bmatrix} $$

    更准确地说: M1,1=2M_{1,1} = 2M1,j=C(K,K+2j)M_{1,j} = C(K, K+2-j) 对于 j2j\ge 2, 对于 i2i\ge 2Mi,j=C(K+2i,K+2j)M_{i,j} = C(K+2-i, K+2-j)jij \ge i,否则为 00

    4. 求 aNa_N

    因为 aN=SNSN1a_N = S_N - S_{N-1},且 SN=[MN1X1]1S_N = [M^{N-1} X_1]_1

    初始 X1X_1S1=a1=1S_1 = a_1 = 11K=1,1K1=1,,10=11^K = 1, 1^{K-1}=1, \dots, 1^0=1

    所以:

    X1=[1,1,1,,1]TX_1 = [1, 1, 1, \dots, 1]^T

    计算 XN=MN1X1X_N = M^{N-1} X_1,取第一个分量得 SNS_N, 计算 XN1=MN2X1X_{N-1} = M^{N-2} X_1,取第一个分量得 SN1S_{N-1}, 则 aN=SNSN1a_N = S_N - S_{N-1}

    5. 边界情况

    N=1N=1 时直接输出 11

    6. 实现细节

    • 模数 MOD=109+7MOD = 10^9+7
    • 矩阵大小 m=K+212m = K+2 \le 12,矩阵乘法 O(m3)O(m^3)
    • 用快速幂计算 MN1M^{N-1},复杂度 O(m3logN)O(m^3 \log N)
    • 组合数预处理到 K10K \le 10 即可

    算法步骤

    1. 读入 N,KN, K
    2. N=1N=1 输出 11
    3. 预处理组合数 C[i][j]C[i][j]MODMOD
    4. 构造 m×mm \times m 转移矩阵 MM
    5. 计算 X1X_1(全 11 向量)
    6. 计算 P=MN1P = M^{N-1}Q=MN2Q = M^{N-2}(当 N>1N>1
    7. 计算 SN=(PX1)[0]S_N = (P \cdot X_1)[0]SN1=(QX1)[0]S_{N-1} = (Q \cdot X_1)[0]
    8. 输出 (SNSN1)modMOD(S_N - S_{N-1}) \bmod MOD

    复杂度分析

    • 时间复杂度:O((K+2)3logN)O((K+2)^3 \log N),完全满足 N1018,K10N \le 10^{18}, K \le 10
    • 空间复杂度:O((K+2)2)O((K+2)^2)
    • 1

    信息

    ID
    6062
    时间
    1400ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者