1 条题解

  • 0
    @ 2025-10-29 19:48:23

    题解

    问题分析

    题目要求计算经过 dd 个夜晚后,宝石岛上 nn 个居民中宝石数前 rr 名的总和的期望(对 998244353998244353 取模)。初始时每个居民有 11 颗宝石,每晚恰好有 11 颗宝石分裂为 22 颗(即总宝石数每天增加 11),dd 天后总宝石数为 n+dn + d

    核心洞察

    1. 总宝石数的确定性dd 天后总宝石数固定为 S=n+dS = n + d,这是后续推导的基础。
    2. 对称性与期望线性性:居民初始状态对称,可通过组合数学刻画分裂过程的概率分布。前 rr 名总和的期望可转化为对“单个居民进入前 rr 名的概率”与“其宝石数期望”的加权求和。
    3. 组合数的意义:分裂过程的路径数与组合数 C(d+n1,n1)C(d + n - 1, n - 1) 相关,这是概率计算的归一化因子。

    算法步骤

    1. 预处理阶乘与逆阶乘:为快速计算组合数 C(n,k)C(n, k),预先计算阶乘 jcjc 及逆阶乘 inv_jcinv\_jc(模 998244353998244353),支持 O(1)O(1) 组合数查询。

    2. 计算辅助数组 ff:通过类似埃氏筛的方法计算 ff 数组,其本质是利用数论变换(如莫比乌斯反演)处理累加项,用于刻画分裂次数的分布特征。具体来说,对每个 ii,通过遍历其倍数 jj 累加 f[ij]f[i \cdot j]f[j]f[j],实现高效的数论函数求和。

    3. 期望公式的计算:利用包含-排斥原理,通过组合数 C(n,k)C(n, k)、符号项 (1)kr(-1)^{k-r} 及辅助数组 ff,构造前 rr 名总和的期望表达式。最终结果为该表达式除以归一化因子 C(d+n1,n1)C(d + n - 1, n - 1)(模意义下的除法)。

    代码解析

    • 预处理模块init 函数计算阶乘 jcjc 和逆阶乘 inv_jcinv\_jc,为组合数计算提供支持。
    • 辅助数组 ff 的计算:通过筛法遍历 11dd,对每个 ii 及其倍数 jj 累加 f[ij]f[i \cdot j]f[j]f[j],这一步利用了数论函数的 multiplicative 性质,高效处理累加项。
    • 期望计算res 的求和式结合了组合数、符号项和 ff 数组,刻画了前 rr 名总和的期望。最终除以 C(d+n1,n1)C(d + n - 1, n - 1) 得到归一化后的期望,输出模 998244353998244353 的结果。

    复杂度分析

    • 时间复杂度:O(n+dlogd)O(n + d \log d)。预处理阶乘为 O(N)O(N)NN3×1073 \times 10^7),筛法计算 ff 数组为 O(dlogd)O(d \log d)(类似埃氏筛的时间复杂度),最终求和为 O(n)O(n)
    • 空间复杂度:O(N)O(N),用于存储阶乘、逆阶乘和辅助数组 ff

    综上,该算法通过组合数学与数论工具,结合概率期望的性质,高效求解了前 rr 名宝石数总和的期望,适用于大规模输入数据。

    • 1

    信息

    ID
    4647
    时间
    2000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    3
    已通过
    1
    上传者