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
思路
这是母函数的入门题,关于母函数请看:
这道题的题意就是整数划分问题,给你一个数n,让你求出这个数有几种不同的划分。每个数有无限个可以用.
那么做法就是利用母函数,小于等于n
的整数就是从1~n
,那么因为:
- 1 1 的母函数是
- 2 2 的母函数是
- 3 3 的母函数是
我们只需要一直加到 n n ,把这些多项式的乘积展开,其中次方的系数就是答案。
代码
/*
此处省略v[i],因为v[i]=i
*/
#include <cstdio>
#include <cstring>
#include <cctype>
#include <stdlib.h>
#include <string>
#include <map>
#include <iostream>
#include <stack>
#include <cmath>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
#define inf 1000000
#define mem(a,b) memset(a,b,sizeof(a))
const int N=1000+7;
int c1[N],c2[N];
int main()
{
int n;
while(~scanf("%d",&n))
{
mem(c1,0);
c1[0]=1;
for(int i=1; i<=n; i++)
{
mem(c2,0);
for(int j=0; j*i<=n; j++)
for(int k=0; k+j*i<=n; k++)
c2[k+j*i]+=c1[k];
memcpy(c1,c2,sizeof(c2));
}
printf("%d\n",c1[n]);
}
return 0;
}