$n<=100000$求$\sum_{i=0}^{n}\sum_{j=0}^{i}s(i,j)*2^j*(j!)$,其中$S(i,j)$表示第二类斯特林数。
方法一:多项式求逆。不会。
方法二:
$S(i,j)=\frac{1}{j!}\sum_{k=0}^{j}(-1)^kC_j^k(j-k)^i$,代入得(这里由于j>i是S(i,j)=0因此j可以枚举到n)
$\sum_{i=0}^{n}\sum_{j=0}^{i}s(i,j)*2^j*(j!)$
$=\sum_{i=0}^{n}\sum_{j=0}^{n}2^j*(j!)*\frac{1}{j!}\sum_{k=0}^{j}(-1)^kC_j^k(j-k)^i$
$=\sum_{j=0}^{n}2^j\sum_{k=0}^{j}(-1)^kC_j^k\sum_{i=0}^{n}(j-k)^i$
$=\sum_{j=0}^{n}2^j*(j!)\sum_{k=0}^{j}\frac{(-1)^k}{k!}\frac{\sum_{i=0}^{n}(j-k)^i}{(j-k)!}$
后面俩卷积。搞定。
注意预处理时的边界情况。比如i=0,i=1,i=2之类的。
1 //#include<iostream> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cstdio> 5 //#include<map> 6 #include<math.h> 7 //#include<time.h> 8 //#include<complex> 9 #include<algorithm> 10 using namespace std; 11 12 int n,m,wei; 13 #define maxn 262222 14 const int mod=998244353,G=3; int rev[maxn]; 15 16 int powmod(int a,int b) 17 { 18 int ans=1; 19 while (b) 20 { 21 if (b&1) ans=1ll*ans*a%mod; 22 a=1ll*a*a%mod; b>>=1; 23 } 24 return ans; 25 } 26 27 void dft(int *a,int n,int type) 28 { 29 if (!rev[1]) for (int i=0;i<n;i++) 30 { 31 rev[i]=0; 32 for (int j=0;j<wei;j++) rev[i]|=((i>>j)&1)<<(wei-j-1); 33 } 34 for (int i=0;i<n;i++) if (i<rev[i]) {int t=a[i]; a[i]=a[rev[i]]; a[rev[i]]=t;} 35 for (int i=1;i<n;i<<=1) 36 { 37 int w=powmod(G,(mod-1)/(i<<1)); 38 if (type==-1) w=powmod(w,mod-2); 39 for (int j=0,p=i<<1;j<n;j+=p) 40 { 41 int t=1; 42 for (int k=0;k<i;k++,t=1ll*t*w%mod) 43 { 44 int tmp=1ll*t*a[j+k+i]%mod; 45 a[j+k+i]=(a[j+k]-tmp+mod)%mod; 46 a[j+k]=(a[j+k]+tmp)%mod; 47 } 48 } 49 } 50 if (type==-1) 51 { 52 int inv=powmod(n,mod-2); 53 for (int i=0;i<n;i++) a[i]=1ll*a[i]*inv%mod; 54 } 55 } 56 57 void ntt(int *a,int *b,int *c) 58 { 59 dft(a,n,1); dft(b,n,1); 60 for (int i=0;i<n;i++) c[i]=1ll*a[i]*b[i]%mod; 61 dft(c,n,-1); 62 } 63 64 int two[maxn],fac[maxn],inv[maxn],ni[maxn],g[maxn],h[maxn],f[maxn]; 65 int main() 66 { 67 scanf("%d",&n); 68 two[0]=1; for (int i=1;i<=n;i++) two[i]=(two[i-1]<<1)%mod; 69 fac[0]=1; for (int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mod; 70 inv[n]=powmod(fac[n],mod-2); for (int i=n;i;i--) inv[i-1]=inv[i]*1ll*i%mod; 71 ni[1]=1; for (int i=2;i<=n;i++) ni[i]=ni[mod%i]*1ll*(mod-mod/i)%mod; 72 73 g[0]=1; g[1]=n+1; g[2]=(powmod(2,n+1)-1)*1ll*ni[2]%mod; 74 for (int i=3;i<=n;i++) g[i]=1ll*(mod/(i-1)*1ll*ni[mod%(i-1)]%mod)*(mod+1-powmod(i,n+1))%mod*inv[i]%mod; 75 for (int i=0;i<=n;i++) h[i]=1ll*((i&1)?mod-1:1)*inv[i]%mod; 76 77 m=n+n; for (n=1,wei=0;n<=m;n<<=1,wei++); 78 ntt(h,g,f); m>>=1; 79 int ans=0; 80 for (int i=0;i<=m;i++) ans=(ans+1ll*two[i]*fac[i]%mod*f[i]%mod)%mod; 81 printf("%d\n",ans); 82 return 0; 83 }