在网上找了一大堆卢卡斯的描述,很难懂。
其实公式非常简短
C
m
n
m
o
d
p
=
C
m
/
p
n
/
p
∗
C
m
m
o
d
p
n
m
o
d
p
m
o
d
p
(
p
为
质
数
)
C_m^nmodp=C_{m/p}^{n/p}∗C_{m\ mod\ p}^{n \ mod \ p}mod \ p(p为质数)
Cmnmodp=Cm/pn/p∗Cm mod pn mod pmod p(p为质数)其中我们对
C
m
/
p
n
/
p
C_{m/p}^{n/p}
Cm/pn/p执行递归操作
对
C
m
m
o
d
p
n
m
o
d
p
C_{m\ mod\ p}^{n \ mod \ p}
Cm mod pn mod p进行暴力求解
递归操作代码:
int Lucas(int n, int m, int p) {
if (!m) return 1;
return (LL)C(n%p, m%p)*Lucas(n/p, m/p, p)%p;
}
暴力求解——直接运用乘法逆元求解
ll inv(ll x)//ll->long long
{
return qpow(x,mod-2);
}
void init()
{
f[0] = 1;
for(ll i=1;i<=200000;i++)
{
f[i] = (f[i-1]*i)%p;
}
}
ll C(int n,int m)
{
return f[m]*inv(f[m-n+1])%p*inv(f[n-1])%p;
}