题意:给你n,让你求一个式子如下
解析:我们知道第二类斯特林数的通项公式为
所以上式就变为
然后就是常见操作,把组合数拆开
其中sum(i)就是上面那个等比数列的和
所以我们发现里面那个式子就是卷积的形式
那么直接NTT就行了
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=5e5+10;
const ll mod=998244353;
ll g[MAXN],fac[MAXN],f[MAXN];
int rev[MAXN],k,len,n;
ll ans;
ll ksm(ll x,ll y)
{
ll ans=1;
for (;y;y>>=1,x=(x*x)%mod) if (y&1) ans=(ans*x)%mod;
return ans;
}
void NTT(ll *a,int len,int t)
{
for (int i=0;i<len;i++) if (i<rev[i]) swap(a[i],a[rev[i]]);
for (int i=1;i<len;i<<=1)
{
int s=(i<<1);
ll wn=ksm(3,(mod-1)/s);
if (t==-1) wn=ksm(wn,mod-2);
for (int j=0;j<len;j+=s)
{
ll w=1;
for (int k=j;k<j+i;k++)
{
ll x=a[k]; ll y=(a[k+i]*w)%mod;
a[k]=(x+y)%mod; a[k+i]=(x-y+mod)%mod;
w=(w*wn)%mod;
}
}
}
if (t==-1) {
ll w=(ksm(len,mod-2));
for (int i=0;i<len;i++) a[i]=(a[i]*w)%mod;
}
}
int main()
{
scanf("%d",&n);
g[0]=1; fac[0]=1;
for (int i=1;i<=n;i++) fac[i]=fac[i-1]*(long long)i%mod;
for (int i=1;i<=n;i++) g[i]=g[i-1]*ksm(i,mod-2)%mod;
for (int i=2;i<=n;i++) f[i]=(ksm(i,n+1)+mod-1)%mod*ksm(i-1,mod-2)%mod*g[i]%mod;
for (int i=1;i<=n;i++) if (i&1) g[i]=(mod-g[i])%mod;
f[1]=n+1; f[0]=1;
for (len=1;len<=2*n;len<<=1) k++;
for (int i=0;i<len;i++) rev[i]=((rev[i>>1]>>1)|((i&1)<<(k-1)));
NTT(f,len,1); NTT(g,len,1);
for (int i=0;i<len;i++) f[i]=(f[i]*g[i])%mod;
NTT(f,len,-1);
long long ans=0;
for (int i=0;i<=n;i++) ans=(ans+f[i]*fac[i]%mod*ksm(2,i)%mod)%mod;
cout << ans << endl;
}