Ignatius and the Princess III

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4636 Accepted Submission(s): 3246

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 #include<stdio.h> 2 #include<string.h> 3 int num_[121] , num[121] ; 4 int main () 5 { 6     int n ; 7     while ( scanf ( "%d" , &n ) != EOF ) 8     { 9           for ( int i = 0 ; i <= n ; ++ i )10           {11               num_[i] = 0 ;12               num[i] = 1 ;13           } 14           for ( int i = 2 ; i <= n ; ++ i ) 15           {16               for ( int j = 0 ; j <= n ; ++ j )17                   for ( int k = 0 ; k + j <= n ; k += i )18                   {19                       num_[j+k] += num[j] ;20                   }21               for ( int j = 0 ; j <= n ;  ++ j )22               {23                   num[j] = num_[j] ;24                   num_[j] = 0 ;25               }26           }27           printf ( "%d\n" , num[n] ) ;28     }29     return 0 ; 30 }`

该题目还可以用完全背包写：

` 1 #include<stdio.h> 2 #include<string.h> 3 int dp[121] , n ; 4 void get_dp () 5 { 6      memset( dp , 0 , sizeof (dp) ) ; 7      dp[0] = 1 ; 8      for ( int i = 1 ; i <= 120 ; ++ i ) 9          for ( int j = i ; j <= 120 ; ++ j )10              dp[j] += dp[j - i] ; 11 } 12 int main ()13 {14     get_dp() ;15     while ( scanf ( "%d" , &n ) != EOF )16     {17           printf ( "%d\n" , dp[n] ) ;18     }19     return 0 ;20 }`

• 相关阅读:
IDEA安装scala搭建项目环境
安装配置Maven和创建Java项目
IDEA 2019.2的安装破解教程
GroupBy
C#快速傅立叶变换(Fast Fourier Transform)
多种方式收费解决方案
随机数生成算法
C#生成随机数的三种方法
统治世界的十大算法，你都了解多少？
VR和AR技术是什么意思 二者有什么区别详解
• 原文地址：https://www.cnblogs.com/jbelial/p/2117620.html