Lucas定理:我们令
n=sp+q , m=tp+r .
(q ,r ≤p),p为素数
那么:
int Lucas (ll n , ll m , int p) {
return m == 0 ? 1 : 1ll*comb (n%p , m%p , p) * Lucas (n/p , m/p , p) % p ;
}
//comb()函数中,因为q , r < p , 所以这部分暴力完成即可。
// C++
// 求C(n, m) mod 10007 版本二 要求p z在100000左右
LL f[N]; //N为组合数的底数 的范围
void init(int p){
f[0] = 1;
for(int i = 1; i <= p; ++i)
f[i] = f[i-1] * i % p;
}
LL pow_mod(LL a, LL x, int p){
LL ret = 1;
a %= p;
while(x){
if(x & 1){
ret = ret * a % p;
--x;
}
else{
a = a * a % p;
x >>= 1;
}
}
return ret;
}
LL Lucas(LL n, LL k, int p){
LL ret = 1;
while(n && k){
LL nn = n % p, kk = k % p;
if(nn < kk) return 0;
ret = ret * f[nn] * pow_mod(f[kk] * f[nn - kk] % p, p - 2, p) % p;
n /= p;
k /= p;
}
return ret;
}
</pre><pre code_snippet_id="1660586" snippet_file_name="blog_20160425_1_5341677" name="code" class="cpp">相关题目:
1. hdu3037 saving beans;