题面
凛冬将至,松鼠正忙于采取豆豆。它们从 n
棵树上采取豆豆,但处于可持续性发展的考虑,它们一共最多采取 m
粒豆豆。假设每棵树上都有无限多的豆豆,请计算采取的方案种数并将结果对质数 p
取模。
数据范围:
1≤n,m≤109
1≤p≤105
(保证 p
为质数)
题目链接
分析
实际上这个问题可以转换为求下述方程解的个数:
x1+x2+⋯+xn≤m (xi∈N)
我们首先考虑等于 m
的时候解的个数,不难考虑到使用隔板法。由于每个 xi
都可以取 0
,不妨对它们都加上 1
使其取值范围变为 [1,+∞)
:
x1+x2+⋯+xn⇒(x1+1)+(x2+1)+⋯+(xn+1)=m=m+n
于是我们就可以愉快地使用隔板法啦,其解的种数为:
(n−1m+n−1)
也就是:
(mm+n−1)
这样一来,我们所要求的答案即:
(0n−1)+(11+n−1)+(22+n−1)+⋯+(mm+n−1)
我们联想到组合数的递推式:
(mn)=(mn−1)+(m−1n−1)
于是答案可化简为:
(0n−1)+(11+n−1)+(22+n−1)+⋯+(mm+n−1)=(0n)+(1n)+(2n+1)+⋯+(mm+n−1)=(1n+1)+(2n+1)+⋯+(mm+n−1)=…=(mm+n)
具体求解的时候考虑使用 Lucas 定理, 即当 p
是质数时,对于任意整数 1≤m≤n
时有:
(mn)≡(mmodpnmodp)⋅(m/pn/p)(modp)
同时在计算大组合数取模的时候,可先计算分子 n!
再计算分母 m!(n−m)!
每项的逆元,全部乘起来即可。复杂度 O(nlogn)
。
实现
完整参考代码