struct intm{int x;intm():x:0{}intm(int x):x(x%p){}}
intm operator+ (const intm &a,const intm &b){intm c(a.x+b.x);return c.x>p?c.x-p:c.x;}
intm operator- (const intm &a,const intm &b){intm c(a.x-b.x);return c.x<0?c.x+p:c.x;}
intm operator* (const intm &a,const intm &b){return (ll)a.x*b.x%p;}
intm& operator+= (intm &a,const intm &b){return a=a+b;}
intm& operator-= (intm &a,const intm &b){return a=a-b;}
intm& operator*= (intm &a,const intm &b){return a=a*b;}
intm operator- (const intm &a){return a.x==0?0:p-a.x;}
intm qpow(intm a,int b){intm ans(1);for(;b;b>>=1){if(b&1)ans*=a;a*=a;}return ans;}
intm inv(intm a){return qpow(a,p-2).x;}
intm operator/ (const intm &a,const intm &b){return (ll)a.x*(qpow(b,p-2).x)%p;}
intm& operator/= (intm &a,const intm &b){return a=a/b;}