gpt4 book ai didi

java - 使用 modInverse 计算大数的 C(n, k) 组合

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:33:12 25 4
gpt4 key购买 nike

我想计算 C(n, k) 的组合,其中 nk 可能非常大。我尝试通过如下使用模块化逆来做到这一点,但即使对于小数字也不会给出正确的输出。谁能告诉我哪里错了?

import java.math.BigInteger;

public class Test {

public static int[] factorials = new int[100001];
public static int mod = 1000000007;
public static BigInteger MOD = BigInteger.valueOf(1000000007);

public static void calculateFactorials() {

long f = 1;

for (int i = 1; i < factorials.length; i++) {
f = (f * i) % mod;
factorials[i] = (int) f;
}

}

// Choose(n, k) = n! / (k! * (n-k)!)
public static long nCk(int n, int k) {

if (n < k) {
return 0;
}

long a = BigInteger.valueOf(k).modInverse(MOD).longValue();
long b = BigInteger.valueOf(n - k).modInverse(MOD).longValue();

// Left to right associativity between * and %
return factorials[n] * a % mod * b % mod;

}

public static void main(String[] args) {

calculateFactorials();
System.out.println(nCk(5, 2));

}

}

最佳答案

线条

    long a = BigInteger.valueOf(k).modInverse(MOD).longValue();
long b = BigInteger.valueOf(n - k).modInverse(MOD).longValue();

应该是

    long a = BigInteger.valueOf(factorials[k]).modInverse(MOD).longValue();
long b = BigInteger.valueOf(factorials[n - k]).modInverse(MOD).longValue();

您可能会考虑缓存逆阶乘和阶乘。

关于java - 使用 modInverse 计算大数的 C(n, k) 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25356014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com