ACM学习历程—HDU1028 Ignatius and the Princess III(递推 || 母函数)

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*n*n。

递推稍微快一点,采用二位递推,p[i][j]表示i可以划分成j个数的划分个数。那么n的划分数就是sum(p[n][i])。

对于p[i][j]:

考虑最小的数,如果最小的数是1,就不再考虑这个1,那么就是p[i-1][j-1]。

如果最小数不是1,那么可以对每个数都减一,那么就是p[i-j][j]。

所以 p[i][j] = p[i-1][j-1]+(i-j >= 0 ? p[i-j][j] : 0);

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <algorithm>
#define LL long long

using namespace std;

int n, p[125][125];

void work()
{
    memset(p, 0, sizeof(p));
    p[1][1] = 1;
    for (int i = 2; i <= n; ++i)
        for (int j = 1; j <= n; ++j)
            p[i][j] = p[i-1][j-1]+(i-j >= 0 ? p[i-j][j] : 0);
    LL ans = 0;
    for (int i = 1; i <= n; ++i)
        ans += p[n][i];
    printf("%I64d\n", ans);
}

int main()
{
    //freopen("test.in", "r", stdin);
    while (scanf("%d", &n) != EOF)
        work();
    return 0;
}
时间: 2024-11-10 13:19:39

ACM学习历程—HDU1028 Ignatius and the Princess III(递推 || 母函数)的相关文章

ACM学习历程—HDU1028 Ignatius and the Princess(组合数学)

Ignatius and the Princess 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:

ACM学习历程——HDU4814 Golden Radio Base(数学递推) (12年成都区域赛)

Description Golden ratio base (GRB) is a non-integer positional numeral system that uses the golden ratio (the irrational number (1+√5)/2 ≍ 1.61803399 symbolized by the Greek letter φ) as its base. It is sometimes referred to as base-φ, golden mean b

ACM学习历程—51NOD 1412 AVL树的种类(递推)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1770 这是这次BSG白山极客挑战赛的B题.设p(i, j)表示节点个数为i,高度为j的AVL树的个数. 那么,对于1 <= k <= i-1 p[i][j] += p[k][j-1]*p[i-1-k][j-1]%MOD; p[i][j] += p[k][j-2]*p[i-1-k][j-1]%MOD; p[i][j] += p[k][j-1]*p[i-1-k][j-2]

ACM学习历程—SNNUOJ 1110 A Simple Problem(递推 &amp;&amp; 逆元 &amp;&amp; 组合数学 &amp;&amp; 快速幂)(2015陕西省大学生程序设计竞赛K题)

Description Assuming a finite – radius “ball” which is on an N dimension is cut with a “knife” of N-1 dimension. How many pieces will the “ball” be cut into most?However, it’s impossible to understand the following statement without any explanation.L

hdu acm 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): 11810    Accepted Submission(s): 8362 Problem Description "Well, it seems the first problem is too easy. I will let

HDU1028 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): 12521    Accepted Submission(s): 8838 Problem Description "Well, it seems the first problem is too easy. I will let

HDU1028 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): 25867    Accepted Submission(s): 17879 Problem Description "Well, it seems the first problem is too easy. I will let

HDU1028 Ignatius and the Princess III【母函数】【完全背包】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1028 题目大意: 给定正整数N,定义N = a[1] + a[2] + a[3] + - + a[m],a[i] > 0,1 <= m <= N. 对于给定的正整数N,问:能够找出多少种这样的等式? 思路: 对于N = 4, 4 = 4: 4 = 3 + 1: 4 = 2 + 2: 4 = 2 + 1 + 1: 4 = 1 + 1 + 1 + 1. 共有5种.N=4时,结果就是5.其实就是

hdu1028 Ignatius and the Princess III

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1028 递归能跑... 但是我交了直接超时了,然后我就把数据跑出来了再交的,等的时间有点长(怪不得超时). 过的有点猥琐,看别人代码用母函数过的. 1 #include<iostream> 2 #include<string.h> 3 #include<math.h> 4 #include<stdlib.h> 5 #include<stdio.h> 6