1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| const int M=1<<18|10,K=17; typedef vector <int> Poly;
int w[M],rev[M],Inv[M]; void Init(){ ll t=qpow(3,(P-1)>>K>>1); w[1<<K]=1; rep(i,(1<<K)+1,(1<<(K+1))-1) w[i]=w[i-1]*t%P; drep(i,(1<<K)-1,1) w[i]=w[i<<1]; Inv[0]=Inv[1]=1; rep(i,2,M-1) Inv[i]=1ll*(P-P/i)*Inv[P%i]%P; } int Init(int n){ int R=1,cc=-1; while(R<n) R<<=1,cc++; rep(i,1,R-1) rev[i]=(rev[i>>1]>>1)|((i&1)<<cc); return R; } void NTT(int n,Poly &a,int f){ if((int)a.size()<n) a.resize(n); rep(i,1,n-1) if(rev[i]<i) swap(a[i],a[rev[i]]); for(int i=1;i<n;i<<=1) { int *e=w+i; for(int l=0;l<n;l+=i*2){ for(int j=l;j<l+i;++j){ int t=1ll*a[j+i]*e[j-l]%P; a[j+i]=a[j]-t,Mod2(a[j+i]); a[j]+=t,Mod1(a[j]); } } } if(f==-1) { reverse(a.begin()+1,a.end()); rep(i,0,n-1) a[i]=1ll*a[i]*Inv[n]%P; } }
Poly operator * (Poly a,Poly b){ int n=a.size(),m=b.size(); int R=Init(n+m-1); NTT(R,a,1),NTT(R,b,1); rep(i,0,R-1) a[i]=1ll*a[i]*b[i]%P; NTT(R,a,-1),a.resize(n+m-1); return a; }
Poly Poly_Inv(Poly a){ int n=a.size(); if(n==1) return {(int)qpow(a[0])}; Poly b=a; b.resize((n+1)/2),b=Poly_Inv(b); int R=Init(n*2); NTT(R,a,1),NTT(R,b,1); rep(i,0,R-1) a[i]=1ll*b[i]*(2-1ll*a[i]*b[i]%P+P)%P; NTT(R,a,-1); a.resize(n); return a; }
Poly Deri(Poly a){ rep(i,1,a.size()-1) a[i-1]=1ll*i*a[i]%P; a.pop_back(); return a; } Poly IDeri(Poly a){ a.pb(0); drep(i,a.size()-2,0) a[i+1]=1ll*a[i]*Inv[i+1]%P; a[0]=0; return a; }
Poly Ln(Poly a){ int n=a.size(); a=Deri(a)*Poly_Inv(a),a.resize(n+1); return IDeri(a); }
Poly Exp(Poly a){ int n=a.size(); if(n==1) return Poly{1}; Poly b=a; b.resize((n+1)/2),b=Exp(b); b.resize(n); Poly c=Ln(b); rep(i,0,n-1) c[i]=a[i]-c[i],Mod2(c[i]); c[0]++,c=c*b; c.resize(n); return c; } void Solve() { int I=(qpow(y)-1)*qpow(1ll*n*n%P)%P; Init(); Poly F(n+1); for(int i=1,FInv=1;i<=n;FInv=1ll*FInv*Inv[++i]%P){ F[i]=qpow(I,(i-1)) * (i==1?1:qpow(i,i-2))%P * i%P * i%P * FInv%P; } F=Exp(F); rep(i,1,n) F[n]=1ll*F[n]*i%P; ll res=F[n]*qpow(y,n)%P*qpow(n,2*(P+n-3))%P; printf("%lld\n",res); }
|