适用于取模的数为素数
long long qsm(long long a,long long b,long long m)
{
long long res=1;
while(b)
{
if(b&1)
{
res=res*a%m;
}
a=a*a%m;
b>>=1;
}
return res;
}
long long inv(long long a,long long m)
{
return qsm(a,m-2,m);
}
long long comb(long long a,long long b,long long m)
{
if(a<b)
return 0;
if(a==b)
return 1;
if(b>a-b)
b=a-b;
long long ans=1,ca=1,cb=1;
for(long long i=0; i<b; i++)
{
ca=(ca*(a-i))%m;
cb=(cb*(b-i))%m;
}
ans=(ca*inv(cb,m))%m;
return ans;
}
long long lucas(long long a,long long b,long long m)
{
long long res=1;
while(a&&b&&res)
{
res=(res*comb(a%m,b%m,m))%m;
a/=m;
b/=m;
}
return res;
}
//调用 :lucas(下标,上标,取模的数)