Lucas定理是用来求C(n,m)%p的值,其中n与m均为非负整数,p是素数。
先说说这个值应该怎么算。
设Lucas(n, m, p)为上式的值,则Lucas(n, m, p) = cn(n % p, m % p) * Lucas(n / p, m / p, p), Lucas(x, 0, p) = 1;
其中cm(n, m) = a! * (b! * (a - b)!) ^ (p - 2) % p = (a! / (a - b)!) * (b!) ^ (p - 2) % p
代码如下:
int cm(int n, int m)
{
if(n < m) return 0;
else if(m > n - m) m = n - m;
int s1 = 1, s2 = 1;
for(int i = 0; i < m; i++)
s1 = s1 * (n - i) % p, s2 = s2 * (i + 1) % p;
return s1 * qpow(s2, p - 2) % p; //qpow是快速幂
}
int lucas(int n, int m)
{
if(m == 0) return 1;
return cm(n % p, m % p) * lucas(n / p, m / p) % p;
}