Description
在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心。
现在他想计算这样一个函数的值:
S(i, j)表示第二类斯特林数,递推公式为:
S(i, j) = j ∗ S(i − 1, j) + S(i − 1, j − 1), 1 <= j <= i − 1。
边界条件为:S(i, i) = 1(0 <= i), S(i, 0) = 0(1 <= i)
你能帮帮他吗?
Input
输入只有一个正整数
Output
输出f(n)。由于结果会很大,输出f(n)对998244353(7 × 17 × 223 + 1)取模的结果即可。1 ≤ n ≤ 100000
Sample Input
3
Sample Output
87
明天再写。。。。。
明天再写。。。。。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 const int N=100000; 8 int G=3,Mod=998244353; 9 int a[8*N],fac[5*N],R[8*N],ifac[5*N],inv[5*N],c[5*N],b[8*N],ans,n; 10 int qpow(int x,int y) 11 { 12 int res=1; 13 while (y) 14 { 15 if (y&1) res=1ll*res*x%Mod; 16 x=1ll*x*x%Mod; 17 y>>=1; 18 } 19 return res; 20 } 21 void NTT(int *A,int len,int o) 22 {int wn,w,i,j,k,x,y; 23 for (i=0;i<len;i++) 24 if (i<R[i]) swap(A[i],A[R[i]]); 25 for (i=1;i<len;i<<=1) 26 { 27 wn=qpow(G,(Mod-1)/(i<<1)); 28 if (o==-1) wn=qpow(wn,Mod-2); 29 for (j=0;j<len;j+=(i<<1)) 30 { 31 w=1; 32 for (k=0;k<i;k++,w=1ll*w*wn%Mod) 33 { 34 x=A[j+k];y=1ll*w*A[j+k+i]%Mod; 35 A[j+k]=x+y; 36 if (A[j+k]>=Mod) A[j+k]-=Mod; 37 A[j+k+i]=x-y; 38 if (A[j+k+i]<0) A[j+k+i]+=Mod; 39 } 40 } 41 } 42 if (o==-1) 43 { 44 int tmp=qpow(len,Mod-2); 45 for (i=0;i<len;i++) 46 A[i]=1ll*A[i]*tmp%Mod; 47 } 48 } 49 int main() 50 {int i,len,lg; 51 cin>>n; 52 fac[0]=fac[1]=ifac[0]=ifac[1]=inv[1]=1; 53 for (i=2;i<=n;i++) 54 { 55 fac[i]=1ll*fac[i-1]*i%Mod; 56 inv[i]=1ll*(Mod-Mod/i)*inv[Mod%i]%Mod; 57 ifac[i]=1ll*ifac[i-1]*inv[i]%Mod; 58 } 59 for (i=0;i<=n;i++) 60 if (i%2==0) 61 a[i]=ifac[i]; 62 else a[i]=(Mod-ifac[i])%Mod; 63 b[0]=1;b[1]=n+1; 64 for (i=2;i<=n;i++) 65 b[i]=1ll*(qpow(i,n+1)-1)*inv[i-1]%Mod*ifac[i]%Mod,b[i]=(b[i]+Mod)%Mod; 66 len=1; 67 while (len<=2*n) len*=2,lg++; 68 for (i=0;i<len;i++) 69 R[i]=(R[i>>1]>>1)|((i&1)<<(lg-1)); 70 NTT(a,len,1);NTT(b,len,1); 71 for (i=0;i<len;i++) 72 a[i]=1ll*a[i]*b[i]%Mod; 73 NTT(a,len,-1); 74 for (i=0;i<=n;i++) 75 ans=1ll*(ans+1ll*qpow(2,i)*fac[i]%Mod*a[i]%Mod)%Mod; 76 cout<<ans; 77 }