五边形数定理
設(shè)第n個(gè)五邊形數(shù)為,那么,即序列為:1, 5, 12, 22, 35, 51, 70, ...
?
對應(yīng)圖形如下:
?
?
設(shè)五邊形數(shù)的生成函數(shù)為,那么有:
?
?
?
?
以上是五邊形數(shù)的情況。下面是關(guān)于五邊形數(shù)定理的內(nèi)容:
?
五邊形數(shù)定理是一個(gè)由歐拉發(fā)現(xiàn)的數(shù)學(xué)定理,描述歐拉函數(shù)展開式的特性。歐拉函數(shù)的展開式如下:
?
?
?
歐拉函數(shù)展開后,有些次方項(xiàng)被消去,只留下次方項(xiàng)為1, 2, 5, 7, 12, ...的項(xiàng)次,留下來的次方恰為廣義五邊形數(shù)。
?
?
五邊形數(shù)和分割函數(shù)的關(guān)系
?
歐拉函數(shù)的倒數(shù)是分割函數(shù)的母函數(shù),亦即:
?
?? 其中為k的分割函數(shù)。
?
上式配合五邊形數(shù)定理,有:
?
?
? 在?n>0?時(shí),等式右側(cè)的系數(shù)均為0,比較等式二側(cè)的系數(shù),可得?
因此可得到分割函數(shù)p(n)的遞歸式:
?
例如n=10時(shí),有:
?
?
所以,通過上面遞歸式,我們可以很快速地計(jì)算n的整數(shù)劃分方案數(shù)p(n)了。
?
?
題目:?http://acm.hdu.edu.cn/showproblem.php?pid=4651
#include <iostream> #include <string.h> #include <stdio.h>using namespace std; typedef long long LL;const int N=100005; const LL MOD=1000000007;LL ans[N],tmp[N];void Init() {int t=1000;for(int i=-1000;i<=1000;i++)tmp[i+t]=i*(3*i-1)/2;ans[0]=1;for(int i=1;i<N;i++){ans[i]=0;for(int j=1;j<=i;j++){if(tmp[j+t]<=i){if(j&1) ans[i]+=ans[i-tmp[j+t]];else ans[i]-=ans[i-tmp[j+t]];}else break;ans[i]=(ans[i]%MOD+MOD)%MOD;if(tmp[t-j]<=i){if(j&1) ans[i]+=ans[i-tmp[t-j]];else ans[i]-=ans[i-tmp[t-j]];}else break;}ans[i]=(ans[i]%MOD+MOD)%MOD;} } int main() {int t,n;Init();cin>>t;while(t--){cin>>n;cout<<ans[n]<<endl;}return 0; }
?
題目:http://acm.hdu.edu.cn/showproblem.php?pid=4658
?
題意:問一個(gè)數(shù)n能被拆分成多少種方法,且每一種方法里數(shù)字重復(fù)個(gè)數(shù)不能超過k(等于k)。 ? 分析遞推式為: ? #include <iostream> #include <string.h> #include <stdio.h>using namespace std; const int N = 100005; const int MOD = 1000000007;int dp[N];void Init() {dp[0] = 1;for(int i=1;i<N;i++){dp[i] = 0;for(int j=1;;j++){int t = (3*j-1)*j / 2;if(t > i) break;int tt = dp[i-t];if(t+j <= i) tt = (tt + dp[i-t-j])%MOD;if(j&1) dp[i] = (dp[i] + tt)%MOD;else dp[i] = (dp[i] - tt + MOD)%MOD;}} }int Work(int n,int k) {int ans = dp[n];for(int i=1;;i++){int t = k*i*(3*i-1) / 2;if(t > n) break;int tt = dp[n-t];if(t + i*k <= n) tt = (tt + dp[n-t-i*k])%MOD;if(i&1) ans = (ans - tt + MOD)%MOD;else ans = (ans + tt)%MOD;}return ans; }int main() {Init();int n,k,t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&k);printf("%d\n",Work(n,k));}return 0; }?
?
總結(jié)
- 上一篇: 关于landau函数
- 下一篇: HDU4454(几何+三分)