如何计算模数100003中k取大数的n的组合?

时间:2015-09-01 14:24:22

标签: c++ modulo factorial

n的最大值为100 000,k可以是0到100 000之间的任何值。问题要求计算模100 003的值。所以我使用函数来计算n,nk和k的阶乘然后打印fact(n)/(fact(nk)* fact(k))%100 003.我做错了什么以及解决方案是什么?

    long long int fact (int z)
{
    long long int r;
    if(z<=1)return 1;
    r=1LL*z*fact(z-1);
    return r;
}

2 个答案:

答案 0 :(得分:1)

long long不足以容纳fact(n)感兴趣的n,所以你需要一个更智能的算法。

在乘法时应用mod 100003是一种简单的方法来保持范围。但模块化部门很混乱,在这种情况下是不必要的。

考虑如何计算事实(n)/(事实(n-k)*事实(k)),而不需要划分任何大数字或模数。

答案 1 :(得分:1)

大多数zz = 105已经溢出)会溢出。

幸运的是,模数100003的整数形成一个字段(因为100003是素数),所以整个计算(即使它包括一个除法)可以用模100003完成,从而防止任何溢出。

大多数操作都是相同的(除了额外的模运算),但是除法与modular multiplicative inverse相乘,你可以使用extended Euclidian algorithm找到它。