inv[i]=(mod-mod/i)*inv[mod%i]%mod;
const ll mod=1e9+7;
const ll maxn=1e5+1;
ll f[maxn]={1,1};
ll f0[maxn]={1,1};
ll inv[maxn]={1,1};
void init()
{
for(int i=2;i<=maxn;i++)
{
//阶乘数
f[i]=f[i-1]*i%mod;
//i在mod意义下的逆元
f0[i]=(mod-mod/i)*f0[mod%i]%mod;
//阶乘逆元
inv[i]=inv[i-1]*f0[i]%mod;
}
}
//求阶乘数C(a,b)在mod意义下的值
ll C(ll a,ll b)
{
return f[b]*inv[a]%mod*inv[b-a]%mod;
}
#include
#include
#include
#include
using namespace std;
#define LL long long
int inv[1000010];
LL ksm(LL a,LL b,LL mod)
{
int ans=1;
while(b)
{
if(b&1) ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return ans;
}
LL exgcd(LL a,LL b,LL &x,LL &y)
{
if(!b)
{
x=1;
y=0;
return a;
}
LL GCD=exgcd(b,a%b,x,y);
LL tmp=x;
x=y;
y=tmp-a/b*y;
return GCD;
}
LL inv1(LL a,LL mod)//扩展欧几里得求逆元
{
LL x,y;
LL d=exgcd(a,mod,x,y);
if(d==1) return (x%mod+mod)%mod;
return -1;
}
LL inv2(LL a,LL mod)//费马小定理
{
return ksm(a,mod-2,mod);
}
void inv3(LL mod)//线性递推求逆元
{
inv[1]=1;
for(int i=2;i<=mod-1;i++)
{
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
cout<>n>>mod)
{
cout<