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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

P4091-[HEOI2016/TJOI2016]求和【斯特林数,NTT】

發(fā)布時間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P4091-[HEOI2016/TJOI2016]求和【斯特林数,NTT】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P4091


題目大意

給出nnn,求
∑i=0n∑j=0i{ij}2jj!\sum_{i=0}^n\sum_{j=0}^i\begin{Bmatrix}i\\j\end{Bmatrix}2^jj!i=0n?j=0i?{ij?}2jj!


解題思路

看題解才知道2jj!2^jj!2jj!對這nlog?nn\log nnlogn做法沒有任何意義,卡了好久。
首先斯特林數(shù)的通項公式是{nm}=1m!∑k=0m(?1)k(mk)(m?k)n\begin{Bmatrix}n\\m\end{Bmatrix}=\frac{1}{m!}\sum_{k=0}^m(-1)^k\binom{m}{k}(m-k)^n{nm?}=m!1?k=0m?(?1)k(km?)(m?k)n
?∑k=0m(?1)k(m?k)nk!(m?k)!\Rightarrow \sum_{k=0}^m\frac{(-1)^k(m-k)^n}{k!(m-k)!}?k=0m?k!(m?k)!(?1)k(m?k)n?

提到這個式子來(因為如果j>ij>ij>i就是000所以直接不管這個限制)
∑i=0n∑j=0n2jj!∑k=0j(?1)k(j?k)nk!(j?k)!\sum_{i=0}^n\sum_{j=0}^n2^jj!\sum_{k=0}^j\frac{(-1)^k(j-k)^n}{k!(j-k)!}i=0n?j=0n?2jj!k=0j?k!(j?k)!(?1)k(j?k)n?
然后把枚舉iii的那層丟到分數(shù)那里
∑j=0n2jj!∑k=0j(?1)k∑i=0n(j?k)ik!(j?k)!\sum_{j=0}^n2^jj!\sum_{k=0}^j\frac{(-1)^k\sum_{i=0}^{n}(j-k)^i}{k!(j-k)!}j=0n?2jj!k=0j?k!(j?k)!(?1)ki=0n?(j?k)i?
然后這個后面式子就可以卷積了,定義F(x)=(?1)xx!,G(x)=∑i=0nxnx!F(x)=\frac{(-1)^x}{x!},G(x)=\frac{\sum_{i=0}^nx^n}{x!}F(x)=x!(?1)x?,G(x)=x!i=0n?xn?
然后GGG通項公式一下就是G(x)=xn+1?1(x?1)x!G(x)=\frac{x^{n+1}-1}{(x-1)x!}G(x)=(x?1)x!xn+1?1?
時間復(fù)雜度O(nlog?n)O(n\log n)O(nlogn)


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=6e5+10,P=998244353; struct poly{ll a[N],n; }G,F; ll n,ans,fac[N],inv[N],fnv[N],r[N]; ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans; } void NTT(ll *f,ll n,ll op){for(ll i=0;i<n;i++)if(r[i]<i)swap(f[i],f[r[i]]);for(ll p=2;p<=n;p<<=1){ll len=p>>1,tmp=power(3,(P-1)/p);if(op==-1)tmp=power(tmp,P-2);for(ll k=0;k<n;k+=p){ll buf=1;for(ll i=k;i<k+len;i++){ll tt=buf*f[i+len]%P;f[i+len]=(f[i]-tt+P)%P;f[i]=(f[i]+tt)%P;buf=buf*tmp%P;}}}if(op==-1){ll invn=power(n,P-2);for(ll i=0;i<n;i++)f[i]=f[i]*invn%P;}return; } void mul(poly &a,poly &b){ll n=1;while(n<=a.n+b.n)n<<=1;for(ll i=0;i<n;i++)r[i]=(r[i>>1]>>1)^((i&1)?(n>>1):0);NTT(a.a,n,1);NTT(b.a,n,1);for(ll i=0;i<n;i++)a.a[i]=a.a[i]*b.a[i]%P;NTT(a.a,n,-1);return; } int main() {scanf("%lld",&n);fac[1]=fac[0]=fnv[0]=inv[1]=1;for(ll i=2;i<=n;i++)inv[i]=P-(P/i)*inv[P%i]%P;for(ll i=1;i<=n;i++)fac[i]=fac[i-1]*i%P,fnv[i]=inv[i]*fnv[i-1]%P;F.a[0]=G.a[0]=1;F.a[1]=P-1;G.a[1]=n+1;fnv[0]=0;for(ll i=2;i<=n;i++){F.a[i]=(i&1)?(P-fnv[i]):fnv[i];G.a[i]=(power(i,n+1)-1)*inv[i-1]%P*fnv[i]%P;}G.n=F.n=n;mul(G,F);for(ll i=0,pw=1;i<=n;i++){(ans+=G.a[i]*pw%P*fac[i]%P)%=P;pw=pw*2%P;}printf("%lld\n",ans);return 0; }

總結(jié)

以上是生活随笔為你收集整理的P4091-[HEOI2016/TJOI2016]求和【斯特林数,NTT】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。