计算具有大数的分数的模数

时间:2014-04-22 19:45:56

标签: java

我有两个大数字(< 10 ^ 9)nm。我必须计算[(n-1+m)!]/[(n-1)!*m!] 如果答案太大,我必须从(10^9+7)得到模数。 (例如:如果n太大,则为n%mod)。

 int mod = 1000000000+7;

我计算如下。 (我分别计算了上半部分和下半部分)

    long up=1;
    for (long i = a+b-1; i>=Math.max(a, b); i--) {
        up*=i%mod;            
    }
    up=up%mod;
    long down=1;
    for (long i = Math.min(a, b); i>0; i--) {
        down*=i%mod;            
    }

然后将答案打印为

System.out.println((up%mod/down%mod)%mod);

这种方法是否正确。它会给出正确的输出。

我知道(a*b*c)%d == [(a%d)*(b%d)*(c%d)]%d(如果我错了,请纠正我)

有没有这样的方法来计算[a/b]%d

1 个答案:

答案 0 :(得分:1)

(a/b) % c != ((a%c) / (b%c) % c)

而是使用递归公式binomial coefficient来计算模数

(n, k) = (n - 1, k - 1) + (n - 1, k)

在你的情况下,它将是

(n - 1 + m, m) % MOD = ((n - 2 + m, m - 1) % MOD + (n - 2 + m, m) % MOD) % MOD

使用上面的递归来获得结果。