日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ.4555.[HEOI2016TJOI2016]求和(NTT 斯特林数)

發布時間:2024/8/26 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ.4555.[HEOI2016TJOI2016]求和(NTT 斯特林数) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接

\(Description\)

\[\sum_{i=0}^n\sum_{j=0}^iS(i,j)\times 2^j\times j!\mod 998244353\]

其中\(S(i,j)\)為第二類斯特林數(\(S(n,m)\)即在\(m\)個無區別盒子中放\(n\)個不同小球的方案數)。

\(Solution\)



(不知博客園markdowm怎么回事就是顯示格式錯誤)

另:第二類斯特林數 總結。

//7988kb 2340ms #include <cstdio> #include <algorithm> #define mod 998244353 #define G 3 #define invG 332748118 #define Mod(x) x>=mod&&(x-=mod) typedef long long LL; const int N=(1<<18)+5;int pw[N],fac[N],ifac[N],inv[N],rev[N],f[N],g[N];inline int FP(int x,int k) {int t=1;for(; k; k>>=1,x=1ll*x*x%mod)if(k&1) t=1ll*t*x%mod;return t; } void NTT(int *a,int lim,int type) {for(int i=1; i<lim; ++i) if(i<rev[i]) std::swap(a[i],a[rev[i]]);for(int i=2; i<=lim; i<<=1){int mid=i>>1;int Wn=FP(~type?G:invG,(mod-1)/i);for(int j=0; j<lim; j+=i){int w=1,t;for(int k=0; k<mid; ++k,w=1ll*w*Wn%mod)a[j+k+mid]=(a[j+k]-(t=1ll*a[j+k+mid]*w%mod)+mod), Mod(a[j+k+mid]),a[j+k]+=t, Mod(a[j+k]);}}if(type==-1) for(int i=0,inv=FP(lim,mod-2); i<lim; ++i) a[i]=1ll*a[i]*inv%mod; }int main() {int n; scanf("%d",&n);pw[0]=fac[0]=1;for(int i=1; i<=n; ++i)pw[i]=pw[i-1]<<1, Mod(pw[i]), fac[i]=1ll*fac[i-1]*i%mod;ifac[n]=FP(fac[n],mod-2);for(int i=n-1; ~i; --i) ifac[i]=1ll*ifac[i+1]*(i+1)%mod;inv[1]=1;for(int i=2; i<=n; ++i) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;f[0]=g[0]=1, f[1]=mod-1/*not -1==*/, g[1]=n+1;for(int i=2; i<=n; ++i)f[i]=i&1?(mod-ifac[i]):ifac[i],g[i]=1ll*(FP(i,n+1)-1)*inv[i-1]%mod*ifac[i]%mod;//FP(..,..)!=0int len=-1,lim=1; while(lim<=n<<1) lim<<=1,++len;for(int i=1; i<lim; ++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<len);NTT(f,lim,1), NTT(g,lim,1);for(int i=0; i<lim; ++i) f[i]=1ll*f[i]*g[i]%mod;NTT(f,lim,-1);LL ans=0;for(int i=0; i<=n; ++i) ans+=1ll*pw[i]*fac[i]%mod*f[i]%mod;printf("%lld\n",ans%mod);return 0; } 自留 ### $Description$ 求$$\sum_{i=0}^n\sum_{j=0}^iS(i,j)\times 2^j\times j!\mod 998244353$$其中$S(i,j)$為第二類斯特林數($S(n,m)$即在$m$個無區別盒子中放$n$個不同小球的方案數)。 ### $Solution$ 注意到$i<j$時,$S(i,j)=0$,所以$j$的上界可以到$n$。 $$\begin{aligned}\sum_{i=0}^n\sum_{j=0}^iS(i,j)\times 2^j\times j!&=\sum_{i=0}^n\sum_{j=0}^nS(i,j)\times 2^j\times j!\\&=\sum_{j=0}^n2^j\cdot j!\cdot\sum_{i=0}^nS(i,j)\tag !\end{aligned}$$$S(n,m)$的一個公式為$$S(n,m)=\frac{1}{m!}\sum_{k=0}^m(-1)^kC(m,k)(m-k)^n$$即利用容斥,枚舉強制為空的盒子有多少個(空盒子至少有多少個)。因為盒子無序所以再除以$m!$。然后可以化簡。$$\begin{aligned}S(n,m)&=\frac{1}{m!}\sum_{k=0}^m(-1)^kC(m,k)(m-k)^n\\&=\sum_{k=0}^m(-1)^k\frac{1}{k!(m-k)!}(m-k)^n\\&=\sum_{k=1}^m\frac{(-1)^k}{k!}\cdot\frac{(m-k)^n}{(m-k)!}\end{aligned}$$注意到這是個卷積形式,所以我們可以$O(n\log n)$計算出$S(n,i)$。 當然本題還是把上式代回去。$$\begin{aligned}\sum_{j=0}^n2^j\cdot j!\cdot\sum_{i=0}^nS(i,j)&=\sum_{j=0}^n2^j\cdot j!\cdot\sum_{i=0}^n\sum_{k=0}^j\frac{(-1)^k}{k!}\cdot\frac{(j-k)^i}{(j-k)!}\\&=\sum_{j=0}^n2^j\cdot j!\cdot\sum_{k=0}^j\frac{(-1)^k}{k!}\cdot\frac{\sum_{i=0}^n(j-k)^i}{(j-k)!}\tag !\end{aligned}$$注意到后面還是個卷積形式,令$f(x)=\frac{(-1)^x}{x!},g(x)=\frac{\sum_{i=0}^nx^i}{x!}$。 設$S_n=\sum_{i=0}^nx^i$,則$xS_n=\sum_{i=1}^{n+1}x^i$,得$S_n=\frac{x^{n+1}-1}{x-1}$,即$g(x)=\frac{x^{n+1}-1}{(x-1)x!}\tag !$。特殊的,令$g(0)=1,g(1)=n+1$。 這樣$f,g$都可以遞推。 然后$$Ans=\sum_{j=0}^n2^j\cdot j!\cdot(f*g)(j)$$NTT就行了。

轉載于:https://www.cnblogs.com/SovietPower/p/9715954.html

總結

以上是生活随笔為你收集整理的BZOJ.4555.[HEOI2016TJOI2016]求和(NTT 斯特林数)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。