1 条题解
-
0
题目理解
我们需要计算: [ S(n,k) = \sum_{i=0}^k \binom{n}{i} \mod 2333 ] 其中 ,有 组询问。
问题分析
1. 直接计算的困难
- 极大,无法直接计算组合数
- 模数 较小,考虑卢卡斯定理
2. 卢卡斯定理 (Lucas Theorem)
对于质数 : [ \binom{n}{m} \mod p = \binom{\lfloor n/p \rfloor}{\lfloor m/p \rfloor} \cdot \binom{n \mod p}{m \mod p} \mod p ]
这里 。
思路推导
设:
- ,其中 ,
- ,其中 ,
则: [ S(n,k) = \sum_{i=0}^k \binom{n}{i} = \sum_{i=0}^{c \cdot p + d} \binom{a \cdot p + b}{i} ]
将 写成 的形式,其中:
- 时,
- 时,
应用卢卡斯定理
[ \binom{n}{i} = \binom{a \cdot p + b}{x \cdot p + y} = \binom{a}{x} \cdot \binom{b}{y} \mod p ]
因此: [ S(n,k) = \sum_{x=0}^{c-1} \sum_{y=0}^{p-1} \binom{a}{x} \binom{b}{y} + \sum_{y=0}^d \binom{a}{c} \binom{b}{y} ]
整理得: [ S(n,k) = \left( \sum_{x=0}^{c-1} \binom{a}{x} \right) \cdot \left( \sum_{y=0}^{p-1} \binom{b}{y} \right) + \binom{a}{c} \cdot \left( \sum_{y=0}^d \binom{b}{y} \right) \mod p ]
关键观察
令:
- 则上面的式子可以写成:
[ F(n,k) = F(a, c-1) \cdot F(b, p-1) + \binom{a}{c} \cdot F(b, d) \mod p ]
其中:
- ,
- ,
递归求解
这样我们就把 分解成了:
- 两个规模更小的 函数: 和
- 一个组合数
- 一个预处理值
递归边界:
- 当 且 时,可以直接计算
- 当 时,(二项式定理)
预处理
由于 较小,我们可以预处理:
- 组合数表 对于
- 前缀和表 对于
这样递归到边界时可以直接查表。
复杂度分析
- 预处理:,可接受
- 每次递归:(查表)
- 递归深度:$O(\log_p n) \approx O(\log_{2333} 10^{18}) \approx 6$
- 总复杂度:,对于 可接受
算法步骤
-
预处理:
- 计算 对于
- 计算 对于
-
递归函数 :
- 如果 :返回
- 如果 且 :直接返回
- 如果 :返回 (利用快速幂)
- 否则:
- ,
- ,
- 返回 $[F(a,c-1) \times F(b,p-1) + C[a][c] \times F(b,d)] \mod p$
样例验证
输入:
3 5 5 10 7 1145 14计算过程:
-
:
- ,直接查表:
-
:
- ,直接查表:
-
:
- 需要递归计算,最终得
输出:
32 968 763符合样例。
总结
本题的关键在于:
- 利用卢卡斯定理将大问题分解为小问题
- 设计递归函数 并找到递推关系
- 预处理小范围的结果以提高效率
- 注意边界情况的处理
- 1
信息
- ID
- 4378
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者