代码:
void e_gcd(LL a, LL b, LL &x, LL &y)
{
if(b == 0)
{
x = 1; y = 0;
return ;
}
e_gcd(b, a % b, x, y);
int tm = x; x = y;
y = tm - a / b * y;
}
LL lucas(int n, int m, int p)
{
LL ans = 1;
while(m && n && ans)
{
ans = (ans * c_mn(n % p, m % p, p)) % p;
m /= p;
n /= p;
}
return ans;
}
LL c_mn(LL a, LL b, LL p)
{
if(a < b) return 0;
if(a == b) return 1;
if(b > a - b) b = a - b;
LL ca, cb;
ca = cb = 1;
for(LL i = 0; i < b; i++)
{
ca = (ca * (a - i)) % p;
cb = (cb * (b - i)) % p;
}
LL x, y;
e_gcd(cb, p, x, y);
x = ((x % p) + p) % p;
LL ans = (ca * x) % p;
return ans;
}