BZOJ 4555 [Tjoi2016Heoi2016]求和
生活随笔
收集整理的這篇文章主要介紹了
BZOJ 4555 [Tjoi2016Heoi2016]求和
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接
https://www.lydsy.com/JudgeOnline/problem.php?id=4555
題解
f(n)=∑i=0n∑j=0iS(i,j)×2j×j!=∑i=0n∑j=0nS(i,j)×2j×j!=∑i=0n∑j=0n2j∑k=0j(?1)k(jk)(j?k)i=∑i=0n∑j=0n2j×j!∑k=0j(?1)kk!×(j?k)i(j?k)!=∑j=0n2j×j!∑k=0j(?1)kk!×∑ni=0(j?k)i(j?k)!(1)(2)(1)(3)(2)(1)f(n)=∑i=0n∑j=0iS(i,j)×2j×j!(2)=∑i=0n∑j=0nS(i,j)×2j×j!(1)=∑i=0n∑j=0n2j∑k=0j(?1)k(jk)(j?k)i(3)=∑i=0n∑j=0n2j×j!∑k=0j(?1)kk!×(j?k)i(j?k)!(2)=∑j=0n2j×j!∑k=0j(?1)kk!×∑i=0n(j?k)i(j?k)!
其中(1)(1)步驟使用了第二類斯特林數的展開式S(i,j)=1j!∑jk=0(?1)k(jk)(j?k)iS(i,j)=1j!∑k=0j(?1)k(jk)(j?k)i,(2)(2)步驟是一個卷積形式,模數比較特殊可以用NTT優化,∑ni=0(j?k)i∑i=0n(j?k)i很明顯是一個等比數列求和。
代碼
#include <cstdio> #include <algorithm>int read() {int x=0,f=1;char ch=getchar();while((ch<'0')||(ch>'9')){if(ch=='-'){f=-f;}ch=getchar();}while((ch>='0')&&(ch<='9')){x=x*10+ch-'0';ch=getchar();}return x*f; }const int maxn=200000; const int maxm=340000; const int mod=998244353; const int G=3;int quickpow(int a,int b,int m) {int res=1;while(b){if(b&1){res=1ll*res*a%m;}a=1ll*a*a%m;b>>=1;}return res; }int add(int x,int y,int m) {int res=x+y;if(res>=m){res-=m;}return res; }int minus(int x,int y,int m) {int res=x-y;if(res<0){res+=m;}return res; }int rev[maxm+10],a[maxm+10],b[maxm+10],ans[maxm+10];int getrev(int n) {int m=1,len=0;while(m<=n){m<<=1;++len;}for(int i=1; i<m; ++i){rev[i]=(rev[i>>1]>>1)+((i&1)<<(len-1));}return m; }int fft(int *s,int len) {for(int i=0; i<len; ++i){if(rev[i]<i){std::swap(s[rev[i]],s[i]);}}for(int i=2; i<=len; i<<=1){int gn=quickpow(G,(mod-1)/i,mod);for(int j=0; j<len; j+=i){int g=1;for(int k=0; k<(i>>1); ++k){int x=s[j+k],y=1ll*g*s[j+k+(i>>1)]%mod;s[j+k]=add(x,y,mod);s[j+k+(i>>1)]=minus(x,y,mod);g=1ll*g*gn%mod;}}}return 0; }int main() {int n=read();a[0]=1;int v=1;for(int i=1; i<=n; ++i){v=1ll*minus(0,v,mod)*quickpow(i,mod-2,mod)%mod;a[i]=v;}b[0]=1;v=1;for(int i=1; i<=n; ++i){v=1ll*v*quickpow(i,mod-2,mod)%mod;b[i]=1ll*minus(1,quickpow(i,n+1,mod),mod)*quickpow(minus(1,i,mod),mod-2,mod)%mod*v%mod;}b[1]=n+1;int m=getrev(n<<1);fft(a,m);fft(b,m);for(int i=0; i<m; ++i){ans[i]=1ll*a[i]*b[i]%mod;}fft(ans,m);std::reverse(ans,ans+m+1);v=quickpow(m,mod-2,mod);for(int i=0; i<m; ++i){ans[i]=1ll*ans[i]*v%mod;}v=1;int u=1;for(int i=0; i<=n; ++i){v=add(v,1ll*quickpow(2,i,mod)*u%mod*ans[i]%mod,mod);u=1ll*u*(i+1)%mod;}printf("%d\n",v);return 0; }轉載于:https://www.cnblogs.com/Canopus-wym/p/10376153.html
總結
以上是生活随笔為你收集整理的BZOJ 4555 [Tjoi2016Heoi2016]求和的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenTsdb官方文档-----理解指
- 下一篇: cakephp2 框架下的 持久处理 不