1 条题解
-
0
问题分析
有 所学校,第 所学校:
- 学生总数
- 礼堂容量
- 每个礼堂必须坐满(不能有空位)
要求:每个学校选择 个学生听讲座,问方案数,模 ( 不一定是质数)。
1. 单所学校方案数
对于第 所学校,从 个学生中选 个,方案数为组合数:
总方案数为各学校方案数之积:
需要计算 ,其中 不一定是质数。
2. 难点
普通 Lucas 定理或逆元法要求模数是质数,这里 任意,不能直接用逆元。
组合数公式: 所以: $ \text{Ans} = \frac{\prod_{i=1}^n c_i!}{\prod_{i=1}^n x_i! \cdot \prod_{i=1}^n (c_i - x_i)!} $
问题转化为:计算一个分数的模 值,但分母可能与 不互素,不能直接求逆元。
3. 质因数分解法
设 是 的质因数分解。
对每个质因子 ,计算 中 的幂次以及剩余部分:
令 则 $ v_q\left( \binom{c}{x} \right) = v_q(c!) - v_q(x!) - v_q((c-x)!) $ 用 Legendre 公式: $ v_q(n!) = \left\lfloor \frac{n}{q} \right\rfloor + \left\lfloor \frac{n}{q^2} \right\rfloor + \dots $
对每个质因子 ,计算: $ E_q = \sum_{i=1}^n \left[ v_q(c_i!) - v_q(x_i!) - v_q((c_i - x_i)!) \right] $ 如果 ( 中 的幂次 ),那么最终答案中 的幂次至少为 ,模 为 。
如果对所有 都有 ,那么我们可以计算: 去掉所有因子 后,剩余部分与 互素,可以求逆元。
4. 实际计算步骤
- 对 做质因数分解。
- 对每个质因子 ,计算 。
- 如果存在 使得 ,输出 (因为组合数乘积是 的倍数)。
- 否则,计算: $ N = \prod_{i=1}^n c_i!,\quad D = \prod_{i=1}^n x_i! \cdot \prod_{i=1}^n (c_i-x_i)! $ 但计算时去掉所有质因子 (即只保留与 互素的部分)。
- 计算 ,其中 是 在模 下的逆元(因为现在 与 互素)。
5. 样例验证
输入:
n=2, p=10000000 x = [1, 2] c = [100, 2000]计算: $ \binom{100}{1} = 100,\quad \binom{2000}{2} = \frac{2000 \times 1999}{2} = 1999000 $ 乘积: 模 : 与输出一致。
6. 算法复杂度
- 质因数分解 :,但 可行。
- 计算阶乘的质因子幂次:需要预处理或直接计算,但 可能很大(题目未给范围,但应能接受 计算)。
- 总体可行。
7. 总结
本题的关键是处理模数不一定是质数情况下的组合数乘积。通过质因数分解,分别处理每个质因子的幂次,可以判断是否答案为 ,否则去掉公共质因子后利用互质性求逆元。这是一种标准的非质数模数下组合数计算方法。
- 1
信息
- ID
- 4001
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者