题意
求
Smn S n m 表示第二类斯特林数
题解
考虑到当 i<j i < j 时 Sji=0 S i j = 0
考虑到
那么
设 f(i)=(−1)ii!,g(i)=∑nj=0iji!=in+1−1(i−1)i!, f ( i ) = ( − 1 ) i i ! , g ( i ) = ∑ j = 0 n i j i ! = i n + 1 − 1 ( i − 1 ) i ! , 特别的 g(0)=n+1 g ( 0 ) = n + 1
这样求一遍 NTT N T T 即可
#include<bits/stdc++.h>
#define fp(i,a,b) for(register int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(register int i=a,I=b-1;i>I;--i)
#define go(u) for(register int i=fi[u],v=e[i].to;i;v=e[i=e[i].nx].to)
#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=3e5+5,P=998244353,G=3;
typedef int arr[N];
typedef long long ll;
int n,ans,K;arr a,b,R,wn,Mi,fac,inv,ifac;
inline int pls(int a,int b){return a+=b,a<P?a:a-P;}
inline int sub(int a,int b){return a-=b,a<0?a+P:a;}
inline int fpm(int a,int b){int x=1;for(;b;b>>=1,a=(ll)a*a%P)if(b&1)x=(ll)x*a%P;return x;}
inline void init(){for(int i=0,j=0;i<K;++i){R[i]=j;for(int l=K>>1;(j^=l)<l;l>>=1);}}
inline void dft(int*a,int ty=1){
fp(i,0,K-1)if(i>R[i])swap(a[i],a[R[i]]);
for(int i=2;i<=K;i<<=1){
const int d=i>>1,e=ty==1?fpm(G,(P-1)/i):fpm(G,P-1-(P-1)/i);int o;
fp(i,1,d-1)wn[i]=(ll)wn[i-1]*e%P;
for(int*x=a;x!=a+K;x+=i)fp(k,0,d-1)
o=(ll)x[k+d]*wn[k]%P,x[k+d]=sub(x[k],o),x[k]=pls(x[k],o);
}if(ty^1){
const int inv=fpm(K,P-2);
fp(i,0,K-1)a[i]=(ll)a[i]*inv%P;
}
}
int main(){
#ifndef ONLINE_JUDGE
file("s");
#endif
scanf("%d",&n);
inv[1]=a[0]=b[0]=wn[0]=Mi[0]=1;a[1]=P-1;b[1]=n+1;
fac[0]=1;fp(i,1,n)fac[i]=(ll)fac[i-1]*i%P,Mi[i]=pls(Mi[i-1],Mi[i-1]);
ifac[n]=fpm(fac[n],P-2);fd(i,n,1)ifac[i-1]=(ll)ifac[i]*i%P;
fp(i,2,n)inv[i]=(ll)(P-P/i)*inv[P%i]%P;
fp(i,2,n)a[i]=i&1?P-ifac[i]:ifac[i],
b[i]=(ll)(fpm(i,n+1)-1)*inv[i-1]%P*ifac[i]%P;
K=1;while(K<=n)K<<=1;K<<=1;init();
dft(a),dft(b);fp(i,0,K-1)a[i]=(ll)a[i]*b[i]%P;dft(a,-1);
fp(i,0,n)ans=pls(ans,(ll)Mi[i]*fac[i]%P*a[i]%P);
printf("%d\n",ans);
return 0;
}