HDU 4651 数学 五边形数定理

Partition

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)


Problem Description
How many ways can the numbers 1 to 15 be added together to make 15? The technical term for what you are asking is the "number of partition" which is often called P(n). A partition of n is a collection of positive integers (not necessarily distinct) whose sum equals n.

Now, I will give you a number n, and please tell me P(n) mod 1000000007.
 

Input
The first line contains a number T(1 ≤ T ≤ 100), which is the number of the case number. The next T lines, each line contains a number n(1 ≤ n ≤ 10 5) you need to consider.

 

Output
For each n, output P(n) in a single line.
 

Sample Input
  
  
4 5 11 15 19
 

Sample Output
  
  
7 56 176 490
题解:五边形数定理

设第n个五边形数为,那么,即序列为:1, 5, 12, 22, 35, 51, 70, ...

 

对应图形如下:

 

 

设五边形数的生成函数为,那么有:

 

 

 

 

以上是五边形数的情况。下面是关于五边形数定理的内容:

 

五边形数定理是一个由欧拉发现的数学定理,描述欧拉函数展开式的特性。欧拉函数的展开式如下:

 

 

 

欧拉函数展开后,有些次方项被消去,只留下次方项为1, 2, 5, 7, 12, ...的项次,留下来的次方恰为广义五边形数。

 

 

五边形数和分割函数的关系

 

欧拉函数的倒数是分割函数的母函数,亦即:

 

   其中为k的分割函数。

 

上式配合五边形数定理,有:

 

 

 
在 n>0 时,等式右侧的系数均为0,比较等式二侧的系数,可得
 

p(n) - p(n-1) - p(n-2) + p(n-5) + p(n-7) + \cdots=0

 

因此可得到分割函数p(n)的递归式:p(n) = p(n-1) + p(n-2) - p(n-5) - p(n-7) + \cdots

 

例如n=10时,有:p(10) = p(9) + p(8) - p(5) - p(3) = 30 + 22 - 7 -  3 = 42

 

 

所以,通过上面递归式,我们可以很快速地计算n的整数划分方案数p(n)了。

以上内容转载自http://blog.csdn.net/acdreamers/article/details/12259815

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;
ll dp[100005];
const ll mod=1000000007;
void init(){
	ll i,j;
	for(i=1;i<=100000;i++){
		for(j=1;;j++){
			ll k1=j*(3*j-1)/2,k2=j*(3*j+1)/2;
			ll signs=j%2?1:-1;
			if(k1>i)break;
			dp[i]=(dp[i]+signs*(dp[i-k1])+mod)%mod;
			if(k2>i)break;
			dp[i]=(dp[i]+signs*(dp[i-k2])+mod)%mod;
		}
		dp[i]=(dp[i]+mod)%mod;
	}
}
int main(){
	int t;
	scanf("%d",&t);
	dp[0]=1;
	init();
	while(t--){
		ll n;
		scanf("%lld",&n);
		printf("%lld\n",dp[n]);
	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值