HDU 1028 Ignatius and the Princess III(母函数)

Ignatius and the Princess III

                Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

                       Total Submission(s): 9408    Accepted Submission(s): 6642

Problem Description
"Well, it seems the first problem is too easy. I will let you know how foolish you are later." feng5166 says.
"The second problem is, given an positive integer N, we define an equation like this:   N=a[1]+a[2]+a[3]+...+a[m];   a[i]>0,1<=m<=N; My question is how many different equations you can find for a given N. For example, assume N is 4, we can find:   4 = 4;   4 = 3 + 1;   4 = 2 + 2;   4 = 2 + 1 + 1;   4 = 1 + 1 + 1 + 1; so the result is 5 when N is 4. Note that "4 = 3 + 1" and "4 = 1 + 3" is the same in this problem. Now, you do it!"
 

 

Input
The input contains several test cases. Each test case contains a positive integer N(1<=N<=120) which is mentioned above. The input is terminated by the end of file.
 

 

Output
For each test case, you have to output a line contains an integer P which indicate the different equations you have found.
 

 

Sample Input
4
10
20
 

 

Sample Output
5
42
627
 
 
题目分析:题目要求的是整数的拆分方案个数,用母函数处理。
 
母函数详解链接:http://www.wutianqi.com/?p=596
 
 1 #include <stdio.h>
 2 
 3 int N;
 4 const int MAX_NUM = 125;
 5 int   solNum[MAX_NUM];
 6 int   temp[MAX_NUM];
 7 
 8 void InitGenerFun()
 9 {
10     for(int i = 0; i < MAX_NUM; i++)
11     {
12         solNum[i] = 1;
13         temp[i]   = 0;
14     }
15     for(int i = 2; i < MAX_NUM; i++)
16     {
17         for(int j = 0; j < MAX_NUM; j++)
18         {
19             for(int k = 0; k+j < MAX_NUM; k+=i)
20             {
21                 temp[k+j] += solNum[j];
22             }
23         }
24         for(int k = 0; k < MAX_NUM; k++)
25         {
26             solNum[k] = temp[k];
27             temp[k]   = 0;
28         }
29     }
30 }
31 
32 int main()
33 {
34     InitGenerFun();
35 
36     while(scanf("%d", &N) != EOF)
37     {
38         printf("%d\n", solNum[N]);
39     }
40 
41     return 0;
42 }

 

posted @ 2013-05-29 22:49  Dreamcaihao  阅读(165)  评论(0编辑  收藏  举报