[英]How do i calculate combinations of n taken by k for large numbers in modulo 100003?
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;
}
long long
不足以容纳有趣的 n 的fact(n)
,因此您需要一个更智能的算法。
在乘法时应用 mod 100003 是一种保持范围内的简单方法。 但是模块化划分是混乱的,在这种情况下是不必要的。
考虑如何计算 fact(n)/( fact(nk)*fact(k) ) 而无需除任何大数或模数。
ncr=n!/((nr)!*r!)
(a/b)%p!=((a%p)/(b%p))%p
使用费马小定理我们可以计算这个
这里 fact() 表示阶乘。
nCr % p = (fac[n] modInverse(fac[r]) % p modInverse(fac[nr]) % p) % p;
这里 modInverse() 表示模 p 下的模逆。
如果 p 是素数,则计算 ,moduloINverse
long long modInverse( long long n, int p)
{
return expo(n, p - 2, p);
}
long long expo(long long a, long long b, long long mod) {
long long res = 1;
while (b > 0) {
if (b & 1)res = (res * a) % mod;
a = (a * a) % mod;
b = b >> 1;}
return res;}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.