p为素数,a,b为正整数,并且
a = akp^k+ak-1p^k-1+...+a1p+a0
b = bkp^k+bk-1p^k-1+...+b1p+b0
所有0<=ai,bi<=p-1
C(a,b) = C(ak,bk)*C(ak-1,bk-1)*...*C(a0,b0)%p
fac表示阶乘,inv表示逆元
LL Lucas( LL a , LL b )
{
LL res = 1;
while ( a&&b )
{
LL aa = a%mod;
LL bb = b%mod;
if ( aa<bb ) return 0;
res = res*fac[aa]%mod*inv[fac[bb]]%mod*inv[fac[aa-bb]]%mod;
a = a/mod;
b = b/mod;
}
return res;
}
本文介绍了一种利用Lucas定理进行大组合数计算的方法,该方法通过将整数a和b分解为p进制的形式,然后分别计算各对应位上的组合数,并在素数p意义下取模,最终得到结果。代码实现使用了阶乘和逆元等数学工具。
659

被折叠的 条评论
为什么被折叠?



