# 【BZOJ4555】[TJOI2016&HEOI2016] 求和（NTT）

### 推式子

$\sum_{i=0}^n\sum_{j=0}^nS(i,j)*2^j*(j!)$

$\sum_{j=0}^n2^j*(j!)\sum_{i=0}^nS(i,j)$

$\sum_{j=0}^n2^j*(j!)\sum_{i=0}^n\sum_{k=0}^j\frac{(-1)^k*(j-k)^i}{k!(j-k)!}$

$\sum_{j=0}^n2^j*(j!)\sum_{k=0}^j\frac{(-1)^k}{k!(j-k)!}*\sum_{i=0}^n(j-k)^i$

$\sum_{k=0}^j\frac{(-1)^k}{k!(j-k)!}*\sum_{i=0}^n(j-k)^i$

$\sum_{k=0}^j\frac{(-1)^k}{k!}*\sum_{i=0}^n\frac{(j-k)^i}{(j-k)!}$

$f_x=\frac{(-1)^x}{x!}$

$g_x=\sum_{i=0}^n\frac{x^i}{x!}=\frac{\sum_{i=0}^nx^i}{x!}=\frac{\frac{x^{n+1}-1}{x-1}}{x!}=\frac{x^{n+1}-1}{(x-1)x!}$

$\sum_{k=0}^jf_{k}*g_{j-k}$

$(f*g)(j)$

$\sum_{j=0}^n2^j*(j!)*(f*g)(j)$

### 代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 100000
#define X 998244353
#define Qinv(x) (Qpow(x,X-2))
#define swap(x,y) (x^=y^=x^=y)
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
#define XSum(x,y) ((x)+(y)>=X?(x)+(y)-X:(x)+(y))
#define XSub(x,y) ((x)-(y)<0?(x)-(y)+X:(x)-(y))
using namespace std;
int n,a[(N<<2)+5],b[(N<<2)+5],Fac[N+5],Inv[N+5];
I int Qpow(RI x,RI y) {RI res=1;W(y) y&1&&(res=1LL*res*x%X),x=1LL*x*x%X,y>>=1;return res;}
class NTT//NTT求模意义下的卷积
{
private:
static const int SZ=N,PR=3,IP=(X+1)/3;int P,L,R[(SZ<<2)+5];
I void Transform(int* s,CI op)
{
RI i,j,k,U,S,tx,ty;for(i=0;i^P;++i) i<R[i]&&swap(s[i],s[R[i]]);
for(i=1;i^P;i<<=1) for(U=Qpow(~op?PR:IP,(X-1)/(i<<1)),j=0;j^P;j+=(i<<1))
for(S=1,k=0;k^i;++k,S=1LL*S*U%X) tx=s[j+k],ty=1LL*S*s[i+j+k]%X,s[j+k]=XSum(tx,ty),s[i+j+k]=XSub(tx,ty);
}
public:
I void Solve(CI n,CI m,int* a,int* b)
{
RI i,t;P=1,L=0,memset(R,0,sizeof(R));
W(P<=n+m) P<<=1,++L;for(i=0;i^P;++i) R[i]=(R[i>>1]>>1)|((i&1)<<L-1);
for(Transform(a,1),Transform(b,1),i=0;i^P;++i) a[i]=1LL*a[i]*b[i]%X;
for(Transform(a,-1),t=Qinv(P),i=0;i<=n+m;++i) a[i]=1LL*a[i]*t%X;
}
}NTT;
int main()
{
RI i,t,ans=0;for(scanf("%d",&n),Fac[0]=1,i=1;i<=n;++i) Fac[i]=1LL*Fac[i-1]*i%X;//预处理阶乘
for(Inv[n]=Qpow(Fac[n],X-2),i=n-1;~i;--i) Inv[i]=1LL*Inv[i+1]*(i+1)%X;//预处理阶乘的逆元
for(t=1,i=0;i<=n;++i,t=1LL*t*(X-1)%X) a[i]=1LL*t*Inv[i]%X;//预处理第一个数组
for(b[0]=1,b[1]=n+1,i=2;i<=n;++i) b[i]=1LL*(Qpow(i,n+1)-1)*Qinv(i-1)%X*Inv[i]%X;//预处理第二个数组
for(NTT.Solve(n,n,a,b),t=1,i=0;i<=n;++i,(t<<=1)>=X&&(t-=X)) Inc(ans,1LL*a[i]*t%X*Fac[i]%X);//做一遍NTT，然后统计答案
return printf("%d",ans),0;//输出答案
}


posted @ 2019-03-03 22:27  TheLostWeak  阅读(161)  评论(0编辑  收藏  举报