您的位置:首页 > 其它

HDU1028 Ignatius and the Princess III(整数划分,母函数模板题,无限制)

2018-01-31 16:12 716 查看

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


思路

这是母函数的入门题,关于母函数请看:

母函数(Generating function)详解 — TankyWoo

母函数入门

母函数

母函数详解和史上最通用最高效的母函数模板

这道题的题意就是整数划分问题,给你一个数n,让你求出这个数有几种不同的划分。每个数有无限个可以用.

那么做法就是利用母函数,小于等于
n
的整数就是从
1~n
,那么因为:

11的母函数是(x0+x1+x2+...+xk)(x0+x1+x2+...+xk)

22的母函数是(x0+x2+x4+...+x2k)(x0+x2+x4+...+x2k)

22的母函数是(x0+x3+x6+...+x3k)(x0+x3+x6+...+x3k)

我们只需要一直加到nn,把这些多项式的乘积展开,其中xnxn次方的系数就是答案。

代码

/*
此处省略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
,c2
;
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
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: