#pragma once
#include<cmath>usingnamespacestd;// O(1) 逆元, 素数 mod で動くtemplate<intMOD>structInverse_O1{staticconstexprintp=MOD;staticconstexprintn=ceil(pow(p,1.0/3));staticconstexprintn2=n*n;staticconstexprintpreinv_size=n2+(n<<10)+10;intg[(p>>10)+1],preinv[preinv_size];Inverse_O1(){preinv[0]=preinv[1]=1%p;for(inti=2;i<preinv_size;i++){preinv[i]=1LL*preinv[p%i]*(p-p/i)%p;}intpre[n2+1],suf[n2+1];for(inti=0;i<=n2;i++)pre[i]=suf[i]=0;for(inty=1;y<n;y++){for(intx=0;x<=y;x++){intz=x*n2/y;if(!pre[z])pre[z]=suf[z]=(x<<16)+y;}}for(inti=1;i<=n2;i++){if(!pre[i])pre[i]=pre[i-1];}for(inti=n2-1;i>=0;i--){if(!suf[i])suf[i]=suf[i+1];}for(intj=0;(j<<10)<p;j++){inta=j<<10;inti=1LL*a*n2/p;intx1=pre[i]>>16,y1=pre[i]&65535;intx2=suf[i]>>16,y2=suf[i]&65535;intu1=1LL*a*y1-1LL*p*x1;intu2=1LL*a*y2-1LL*p*x2;g[j]=abs(u1)<abs(u2)?y1:y2;}}intinv(inta){inty=g[a>>10],z=1LL*a*y%p;return1LL*y*(z<preinv_size?preinv[z]:p-preinv[p-z])%p;}intoperator()(inta){returninv(a);}};
#line 2 "math-fast/inv-o1.hpp"
#include<cmath>usingnamespacestd;// O(1) 逆元, 素数 mod で動くtemplate<intMOD>structInverse_O1{staticconstexprintp=MOD;staticconstexprintn=ceil(pow(p,1.0/3));staticconstexprintn2=n*n;staticconstexprintpreinv_size=n2+(n<<10)+10;intg[(p>>10)+1],preinv[preinv_size];Inverse_O1(){preinv[0]=preinv[1]=1%p;for(inti=2;i<preinv_size;i++){preinv[i]=1LL*preinv[p%i]*(p-p/i)%p;}intpre[n2+1],suf[n2+1];for(inti=0;i<=n2;i++)pre[i]=suf[i]=0;for(inty=1;y<n;y++){for(intx=0;x<=y;x++){intz=x*n2/y;if(!pre[z])pre[z]=suf[z]=(x<<16)+y;}}for(inti=1;i<=n2;i++){if(!pre[i])pre[i]=pre[i-1];}for(inti=n2-1;i>=0;i--){if(!suf[i])suf[i]=suf[i+1];}for(intj=0;(j<<10)<p;j++){inta=j<<10;inti=1LL*a*n2/p;intx1=pre[i]>>16,y1=pre[i]&65535;intx2=suf[i]>>16,y2=suf[i]&65535;intu1=1LL*a*y1-1LL*p*x1;intu2=1LL*a*y2-1LL*p*x2;g[j]=abs(u1)<abs(u2)?y1:y2;}}intinv(inta){inty=g[a>>10],z=1LL*a*y%p;return1LL*y*(z<preinv_size?preinv[z]:p-preinv[p-z])%p;}intoperator()(inta){returninv(a);}};