1. 程式人生 > >hdu 1028 Ignatius and the Princess III 母函數

hdu 1028 Ignatius and the Princess III 母函數

input comm show fir case ces panel typedef get

Ignatius and the Princess III

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


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

Recommend We have carefully selected several similar problems for you: 1171 1085 1398 2152 1709 問整數n有多少種拆分可能,那也就是求x^n的系數 所以我們直接用母函數求x^n的系數就行
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <iterator>
#include <iostream>
#include <algorithm>
#define debug(a) cout << #a << " " << a << endl
using namespace std;
const int maxn = 2*1e2 + 10;
const int mod = 10000;
typedef long long ll;
int main() {
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    ll n;
    while( cin >> n ) {
        ll a[maxn], b[maxn];
        for( ll i = 0; i <= n; i ++ ) {
            a[i] = 1, b[i] = 0;
        }
        for( ll i = 2; i <= n; i ++ ) { //最低是從2開始劃分
            for( ll j = 0; j <= n; j ++ ) {
                for( ll k = 0; k*i+j <= n; k ++ ) {
                    b[k*i+j] += a[j];
                }
            }
            for( ll j = 0; j <= n; j ++ ) {
                a[j] = b[j], b[j] = 0;
            }
        }
        cout << a[n] << endl;
    }
    return 0;
}

  

hdu 1028 Ignatius and the Princess III 母函數