- 一般情况下,当Mod较小,组合数较大时用Lucas求组合数,当Mod较大组合数较小时用逆元求组合数
typedef long long ll;
const int Mod=110119;
ll invs[Mod+50];
ll fac[Mod+50];
void initInv(int Mod){
invs[1]=1;
for (int i=2;i<Mod;i++)
invs[i]=invs[Mod%i]*(Mod-Mod/i)%Mod;
}
ll inv(int a,int mod){
return(a==1?1:inv(mod%a,mod)*(mod-mod/a)%mod);
}
ll qPow(ll x,ll n,ll mod){
ll ret=1;
while(n){
if (n&1) ret=(ret*x)%mod;
x=(x*x)%mod;
n>>=1;
}
return ret;
}
void initFac(int Mod){
fac[0]=1;
for(int i=1;i<=Mod;i++){
fac[i]=fac[i-1]*i%Mod;
}
}
ll lucas(ll n,ll k,ll mod){
if (n<0 || k<0 || k>n) return 0;
ll ret=1;
while(n && k){
ll np=n%mod,kp=k%mod;
if (np<kp) return 0;
ret=(ret*fac[np]%mod)*invs[fac[kp]*fac[np-kp]%mod]%mod;
n/=mod; k/=mod;
}
return ret;
}