Ignatius
and the Princess III
Time
Limit: 2000/1000 MS (Java/Others) Memory Limit:
65536/32768 K (Java/Others)
Total Submission(s):
11810 Accepted Submission(s):
8362
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
Author
Ignatius.L
最简单的母函数模板题,用于学习和回顾母函数非常方便,代码也可直接做模板使用
1 /*
2 hdu acm 1028 数字拆分,母函数模板题
3 by zhh
4 */
5 #include <iostream>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <algorithm>
9 #include <cstring>
10
11 using namespace std;
12 #define maxx 120
13 int ans[maxx+2],temp[maxx+2];
14 void init()//母函数打表
15 {
16 for(int i=0;i<=maxx;i++)//初始化第一个式子系数
17 {
18 ans[i]=1;
19 temp[i]=0;//用于临时保存每次相乘的结果
20 }
21 for(int i=2;i<=maxx;i++)//循环每一个式子
22 {
23 for(int j=0;j<=maxx;j++)//循环第一个式子各项
24 for(int k=0;k+j<=maxx;k+=i)//下个式子的各项
25 temp[k+j]+=ans[j];//结果保存到temp数组中
26 for(int j=0;j<=maxx;j++)//临时保存的值存入ans数组
27 {
28 ans[j]=temp[j];
29 temp[j]=0;
30 }
31 }
32 }
33 int main()
34 {35 init();
36 int n;
37 while(scanf("%d",&n)!=EOF)
38 {
39 cout<<ans[n]<<endl;
40 }
41 return 0;
42 }
hdu acm 1028 数字拆分Ignatius and the Princess III