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;
}
答案 0 :(得分:1)
long long
不足以容纳fact(n)
感兴趣的n,所以你需要一个更智能的算法。
在乘法时应用mod 100003是一种简单的方法来保持范围。但模块化部门很混乱,在这种情况下是不必要的。
考虑如何计算事实(n)/(事实(n-k)*事实(k)),而不需要划分任何大数字或模数。
答案 1 :(得分:1)
大多数z
(z = 105
已经溢出)会溢出。
幸运的是,模数100003的整数形成一个字段(因为100003是素数),所以整个计算(即使它包括一个除法)可以用模100003完成,从而防止任何溢出。
大多数操作都是相同的(除了额外的模运算),但是除法与modular multiplicative inverse相乘,你可以使用extended Euclidian algorithm找到它。