我想有效地计算((X+Y)!/(X!是的!)%p(p等于10^9+7)
这个discussion提供了一些关于在除法上分配模的见解。
我关心的是,没有必要对一个数存在模逆。
基本上,我在寻找解决问题的代码实现。
乘法很简单:
public static int mod_mul(int Z,int X,int Y,int P)
{
// Z=(X+Y) the factorial we need to calculate, P is the prime
long result = 1;
while(Z>1)
{
result = (result*Z)%P
Z--;
}
return result;
}
我也意识到许多因子在除法中可以被取消(在取模之前),但是如果除数增加,我发现很难有效地提出除法算法(在列表上循环(因子(X)+因子(Y)…)以查看是哪个除以分子的当前乘因子)。
编辑:我不想使用BigInt解决方案。
是否有任何基于java/python的解决方案或标准算法/库来消除因子(如果逆选项不是完全证明)或处理此类问题。
最佳答案
((X+Y)!/(X!Y!))
是二项系数((X+Y)-choose-X
的一种低级拼写方法虽然您在问题中没有这么说,但代码中的注释意味着P
是prime。把这两个放在一起,卢卡斯定理直接适用:http://en.wikipedia.org/wiki/Lucas%27_theorem。
这给出了一个基于P
和X+Y
的基表示的非常简单的算法。不需要猜测X
,因为你没有对你的参数给出任何限制,除非它们是BigInts
。注意,你的样本int
代码可能根本不起作用,例如,mod_mul
大于最大P
的平方根(因为int
可能溢出)。