[Tjoi2016&Heoi2016]求和

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
带入斯特林数通项公式:
$ \begin{array}{l}f(n) = \sum\limits_{i = 0}^n {\sum\limits_{j = 0}^n {\sum\limits_{k = 0}^j {{{( - 1)}^k}*\frac{{{{(j - k)}^i}}}{{k!(j - k)!}}} {2^j}*j!} } \\\end{array} $
再把i的sigma丢到后面去 $ f(n)=\sum\limits_{j = 0}^n {\sum\limits_{k = 0}^j {{{( - 1)}^k}*\frac{{\sum\limits_{i = 0}^{\rm{n}} {{{(j - k)}^i}} }}{{k!(j - k)!}}} {2^j}*j!}$
$f(n) = \sum\limits_{j = 0}^n {{2^j}*j!\sum\limits_{k = 0}^j {\frac{{{{( - 1)}^k}}}{{{\rm{k!}}}}*\frac{{\sum\limits_{i = 0}^{\rm{n}} {{{(j - k)}^i}} }}{{(j - k)!}}} } $

这就是一个卷积,直接NTT
不过此题还可以分治NTT
 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 }

 

posted @ 2018-01-29 22:03  Z-Y-Y-S  阅读(276)  评论(0编辑  收藏  举报