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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[HEOI2016/TJOI2016]求和

發布時間:2025/3/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [HEOI2016/TJOI2016]求和 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://www.zybuluo.com/ysner/note/1288083

題面

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

  • \(n\leq10^5\)

    解析

    覺得這道題目與[bzoj5093]圖的價值相比,還是小巫見大巫呢。
    公式復雜程度和代碼細節量少了不止一個級別。。。

首先,要求的時間復雜度是\(O(nlogn)\)
則我們需要卷積形式的,第二類斯特林數的,通項公式:(推導過程在鏈接的那篇博文里)
\[S(i,j)=\sum_{k=0}^j\frac{(-1)^k}{k!}\frac{(j-k)^i}{(j-k)!}\]
然后推推式子:
\[=\sum_{i=0}^n\sum_{j=0}^iS(i,j)*2^j*j!\]
注意到\(i<j\)時,\(S(i,j)=0\),我們可以擴大\(j\)的范圍:
\[=\sum_{j=0}^n2^j*j!\sum_{i=0}^nS(i,j)\]

所以題目實際上要求我們把\(\sum_{i=0}^nS(i,j)\)化成卷積形式。
\[\sum_{i=0}^nS(i,j)=\sum_{i=0}^n\sum_{k=0}^j\frac{(-1)^k}{k!}\frac{(j-k)^i}{(j-k)!}\]
\[=\sum_{k=0}^j\frac{(-1)^k}{k!(j-k)!}\sum_{i=0}^n(j-k)^i\]
又根據等比數列求和公式\[\sum_{i=0}^n(j-k)^i=\frac{(j-k)^{n+1}-1}{(j-k)-1}\]
最終式子化為
\[=\sum_{k=0}^n\frac{(-1)^k}{k!}\frac{(j-k)^{n+1}-1}{[(j-k)-1](j-k)!}\]
顯然\(NTT\)輕松解決。

ps:如何快速求階乘的逆元

顯然一般方法是一邊求階乘一邊求逆元,復雜度\(O(nlogn)\)
然而更好的方法是求完階乘后,求出最后一個階乘的逆元,再不斷\(inv[i]=inv[i+1]*(i+1)\)即可。
時間復雜度\(O(n)\)

#include<iostream> #include<cstring> #include<cmath> #include<cstdio> #include<cstdlib> #include<algorithm> #define ll long long #define re register #define il inline #define fp(i,a,b) for(re int i=a;i<=b;i++) #define fq(i,a,b) for(re int i=a;i>=b;i--) using namespace std; const int N=4e5+1,mod=998244353; int n,m,lim=1,l,r[N],a[N],b[N],jc[N],inv[N],ans; il int ksm(re int S,re int n) {re int T=S;S=1;while(n){if(n&1) S=1ll*S*T%mod;T=1ll*T*T%mod;n>>=1;}return S; } il void NTT(re int *A,re int tp) {fp(i,1,lim-1) if(i<r[i]) swap(A[i],A[r[i]]);for(re int mid=1;mid<lim;mid<<=1){re int gu=mid<<1,W=ksm(3,(mod-1)/gu);if(tp==-1) W=ksm(W,mod-2);for(re int j=0;j<lim;j+=gu){re int w=1;for(re int k=0;k<mid;k++,w=1ll*w*W%mod){re ll x=A[j+k],y=1ll*w*A[j+mid+k]%mod;A[j+k]=(x+y)%mod;A[j+mid+k]=(x-y+mod)%mod;}}} } il int gi() {re int x=0,t=1;re char ch=getchar();while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();if(ch=='-') t=-1,ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();return x*t; } int main() {n=m=gi();jc[0]=inv[0]=1;fp(i,1,n) jc[i]=1ll*jc[i-1]*i%mod;inv[n]=ksm(jc[n],mod-2);fq(i,n-1,1) inv[i]=1ll*inv[i+1]*(i+1)%mod;b[0]=1;b[1]=n+1;fp(i,0,n){a[i]=(i&1)?mod-inv[i]:inv[i];if(i>1) b[i]=1ll*(ksm(i,n+1)-1+mod)%mod*ksm(i-1,mod-2)%mod*inv[i]%mod;}while(lim<=n+m) lim<<=1,++l;fp(i,1,lim-1) r[i]=(r[i>>1]>>1)|((i&1)<<l-1);NTT(a,1);NTT(b,1);fp(i,0,lim-1) a[i]=1ll*a[i]*b[i]%mod;NTT(a,-1);re ll Inv=ksm(lim,mod-2);for(re int i=0,j=1;i<=n;++i,j=((ll)j<<1)%mod)(ans+=1ll*a[i]*Inv%mod*jc[i]%mod*j%mod)%=mod;printf("%d\n",ans);return 0; }

轉載于:https://www.cnblogs.com/yanshannan/p/9678526.html

總結

以上是生活随笔為你收集整理的[HEOI2016/TJOI2016]求和的全部內容,希望文章能夠幫你解決所遇到的問題。

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