long long pow_mod(int a,int n)
{
long long ans=1;
while(n)
{
if(n&1) ans=ans*a%mod;
a=a*a%mod;
n>>=1;
}
return ans;
}
long long C(int k,int n)
{
long long sum=1;
for(int i=1,j=n;i<=k;i++,j--)
sum=sum*j*pow_mod(i,mod-2)%mod;
return sum;
}
O(1)
void init()
{
dp[1]=1;
for(long long i=2;i<=1000000;i++)
dp[i]=dp[i-1]*i%mod;
}
long long pow_mod(long long a,long long n)
{
long long ans=1;
while(n)
{
if(n&1) ans=ans*a%mod;
a=a*a%mod;
n>>=1;
}
return ans;
}
long long C(long long a,long long b)
{
if(!b) return 1;
long long ans=dp[a];
ans=ans*pow_mod(dp[a-b],mod-2)%mod;
ans=ans*pow_mod(dp[b],mod-2)%mod;
return ans;
}
Lucas
long long pow_mod(long long a,long long n)
{
long long ans=1;
while(n)
{
if(n&1) ans=ans*a%p;
a=a*a%p;
n>>=1;
}
return ans;
}
long long C(LL n, LL m)
{
if(m > n) return 0;
LL ans = 1;
for(int i=1; i<=m; i++)
{
LL a = (n + i - m) % p;
LL b = i % p;
ans = ans * (a * pow_mod(b, p-2) % p) % p;
}
return ans;
}
LL Lucas(LL n, LL m)///C(n,m)
{
if(m == 0) return 1;
return C(n % p, m % p) * Lucas(n / p, m / p) % p;
}