HDU 4651 2013多校联合第5场 Partition 数论
2013-08-07 19:59
375 查看
Partition
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 422 Accepted Submission(s): 242
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 ≤ 105) 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
題意:整数分拆
思路:此题坑了,虽然很快想出了dp 的解法确发现根本开不了如此之大的数组。方法是:dp
[k]代表k个数加起来等于n的种数。转移方程很容易dp
[k]=dp[n-1][k-1]+dp[n-k][k]。本题正解用的是五边形数定理:(摘wiki百科里面的一段)
![](http://upload.wikimedia.org/math/8/9/d/89d466ae10f8adfc27f768d419237c4d.png)
考虑
![](http://upload.wikimedia.org/math/5/e/d/5ed2ec358abc7d521a3330e8b84cc7df.png)
项的系数,在 n>0 时,等式右侧的系数均为0,比较等式二侧的系数,可得
![](http://upload.wikimedia.org/math/f/9/c/f9cbda69b2b91f3c22c51682fb036e10.png)
因此可得到分割函数p(n)的递归式
![](http://upload.wikimedia.org/math/4/3/e/43ece82da690519129ca823eb824f391.png)
其中规律是两项两项的加减变化。然后里面是n-pi,其中pi是
![](http://upload.wikimedia.org/math/c/e/8/ce85530ff6ef4e2447a4575d90dd15e0.png)
.其他细节可以看代码。
/* * File :tmp.cpp * Author :Kevin Tan * Source :ZJNU * * 2013年8月7日,下午7:16:41 */ #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<climits> #include<utility> #include<cctype> #include<iomanip> #include<string> #include<map> #include<deque> #include<queue> #include<set> #include<vector> #include<iterator> using namespace std; #define MAX 100005 #define MOD 1000000007 int q[MAX], p[MAX]; int main(int argc, char **argv) { q[0] = 0; int k = 1; for (int i = 1; q[k - 1] <= MAX; i++) { q[k++] = (3 * i * i - i) / 2; q[k++] = (3 * i * i + i) / 2; } p[0] = 1; for (int i = 1; i <= MAX; i++) { p[i] = 0; for (int j = 1; q[j] <= i; j++) { if (((j - 1) >> 1) & 1) p[i] = (p[i] - p[i - q[j]]) % MOD;//(j-1)>>1 &1是符号两位两位的变 else p[i] = (p[i] + p[i - q[j]]) % MOD; if (p[i] < 0) p[i] += MOD; } } int T; scanf("%d", &T); while (T--) { int n; scanf("%d", &n); printf("%d\n", p ); } return 0; }
相关文章推荐
- hdu 4602 partition 2013多校联合训练第一场
- 2013 多校第五场 hdu 4651 Partition
- 2013 多校联合 C Partition (hdu 4602)
- HDU 4658 2013 多校联合赛第6场 Integer Partition
- 2013多校联合4 1010 K-string (hdu 4641)
- HDU 4632 2013多校联合第4场 A - Palindrome subsequence
- hdu 4562 Dice 求期望 推数学公式 (2013多校联合)
- 2013 多校联合2 D Vases and Flowers (hdu 4614)
- HDU 4686 Arc of Dream (2013多校联合9 1001)
- HDU 4638 2013多校联合第4场 G-Group
- 2013 多校联合 I I-number(hdu 4608)
- 2013多校联合8 String (hdu 4681)
- hdu 4607 park visit 2013多校联合训练第一场
- HDU 4649 Professor Tian (2013多校联合5 1007)
- hdu 4677 并查集+分块算法 好题 (2013多校联合)
- 2013 多校联合 2 A Balls Rearrangement (hdu 4611)
- 2013多校联合3 1010 No Pain No Game(hdu 4630)
- hdu 4661 Message Passing 树形dp (2013多校联合)
- 2013 多校第一场 hdu 4602 Partition
- 2013 多校联合 H Park Visit (hdu 4607)