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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

自然数幂和伯努利数(Bernoulli)

發布時間:2023/12/14 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自然数幂和伯努利数(Bernoulli) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

二項式定理求自然數冪和

由二項式定理展開得
\[ (n+1)^{k+1}-n^{k+1}=\binom {k+1}1n^k+\binom {k+1}2n^{k-1}+\cdots+\binom {k+1}kn+1 \]

那么,對于所有的\(n=1,2,3,\cdots\)累加得到
\[ (n+1)^{k+1}-1=\binom{k+1}1\sum_{i=1}^ni^k+\binom{k+1}2\sum_{i=1}^ni^{k-1}+\cdots+\binom {k+1}k\sum_{i=1}^ni+n \]

進一步得到
\[ \sum_{i=1}^ni^k=\frac1{k+1}[(n+1)^{k+1}-(\binom{k+1}2\sum_{i=1}^ni^{k-1}+\cdots+\binom {k+1}k\sum_{i=1}^ni+n+1)] \]

\(S(n,k)=\sum_{i=1}^ni^k\),可以得到
\[ S(n,k)=\frac1{k+1}[(n+1)^{k+1}-(\binom{k+1}2S(n,k-1)+\cdots+\binom {k+1}kS(n,1)+n+1)] \]

\(k==1\),有\(S(n,1)=\frac{n\cdot(n+1)}{2}\)。

加入記憶化即可。

伯努利數

\[ \sum_{i=1}^ni^k=\frac{1}{k+1}\sum_{i=1}^{k+1}\binom {k+1}iB_{k+1-i}(n+1)^i \]

伯努利數滿足\(B_0=1\),且有
\[ \sum_{k=0}^n\binom{n+1}kB_k=0 \]

那么有
\[ B_n=-\frac1{n+1}(\binom{n+1}0B_0+\binom{n+1}1B_1+\dots+\binom{n+1}{n-1}B_{n-1}) \]

這樣就可以\(O(n^2)\)預處理出伯努利數。

還可以對\(B_i\)構建指數型生成函數
\[ B(x)=\sum_{i=0}^\infty \frac{B_i}{i!}x^i \]

經過我也不懂得化簡得到
\[ \begin{split} B(x)=\frac{x}{e^x-1}\\ B[x]=ifac[x+1] \end{split} \]

可以利用多項式求逆在\(O(n\log n)\)計算伯努利數。

例題 51nod 1228 序列求和

#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<cstdio> #include<iomanip> #include<cstdlib> #define MAXN 0x7fffffff typedef long long LL; const int N=10005,K=2005,mod=1e9+7; using namespace std; inline LL Getint(){register LL x=0,f=1;register char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}return x*f;} int inv[N],fac[N],ifac[N],B[N]; int C(int n,int m){if(n<m)return 0;return (LL)fac[n]*ifac[m]%mod*ifac[n-m]%mod; } int S(LL n,int k){int ret=0;LL ori=(n+1)%mod,fac=ori;for(int i=1;i<=k+1;i++,fac=(LL)fac*ori%mod)ret=(ret+(LL)C(k+1,i)*B[k+1-i]%mod*fac)%mod;return (LL)(ret+mod)%mod*inv[k+1]%mod; } int main(){inv[1]=fac[0]=ifac[0]=1;for(int i=2;i<=K;i++)inv[i]=(LL)inv[mod%i]*(mod-mod/i)%mod;for(int i=1;i<=K;i++)fac[i]=(LL)fac[i-1]*i%mod;for(int i=1;i<=K;i++)ifac[i]=(LL)ifac[i-1]*inv[i]%mod;B[0]=1;for(int i=1;i<=K;i++){for(int j=0;j<i;j++)B[i]=(B[i]-(LL)B[j]*C(i+1,j))%mod;B[i]=(LL)B[i]*inv[i+1]%mod;}int T=Getint();while(T--){LL n=Getint(),k=Getint();cout<<S(n,k)<<'\n';}return 0; }

轉載于:https://www.cnblogs.com/Emiya-wjk/p/10216170.html

總結

以上是生活随笔為你收集整理的自然数幂和伯努利数(Bernoulli)的全部內容,希望文章能夠幫你解決所遇到的問題。

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