zoukankan      html  css  js  c++  java
  • 母函数

    "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!" 

    InputThe 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. 
    OutputFor 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

    代码:
    /*  gyt
           Live up to every day            */
    
    #include<cstdio>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<stack>
    #include<cstring>`
    #include<queue>
    #include<set>
    #include<string>
    #include<map>
    #include <time.h>
    #define PI acos(-1)
    using namespace std;
    typedef long long ll;
    typedef double db;
    const int maxn = 10000+5;
    const ll maxm = 1e7;
    const ll mod = 1e9 + 7;
    const int INF = 0x3f3f3f;
    const ll inf = 1e15 + 5;
    const db eps = 1e-9;
    int c1[maxn], c2[maxn];
    
    void solve() {
        int n;
        while(scanf("%d", &n)!=EOF) {
            for (int i=0; i<=n; i++) {
                c1[i]=1, c2[i]=0;
            }
            for (int i=2; i<=n; i++) {
                for (int j=0; j<=n; j++) {
                    for (int k=0; j+k<=n; k+=i) {
                        c2[j+k]+=c1[j];
                    }
                }
                for (int j=0; j<=n; j++) {
                    c1[j]=c2[j];
                    c2[j]=0;
                }
            }
            printf("%d
    ", c1[n]);
        }
    }
    int main() {
        int t = 1;
        //freopen("in.txt", "r", stdin);
        //scanf("%d", &t);
        while(t--)
            solve();
        return 0;
    }
  • 相关阅读:
    【NOIP16提高组】换教室
    【扬中集训Day6T1】 白日梦
    【POJ 1061】 青蛙的约会
    【扬中集训DAY5T1】 交换矩阵
    【USACO】 Balanced Photo
    【USACO】 Balanced Lineup

    POJ P3352 Road Construction 解题报告
    洛谷 P2783 有机化学之神偶尔会做作弊 解题报告
    洛谷 P2300 合并神犇 解题报告
  • 原文地址:https://www.cnblogs.com/gggyt/p/7301058.html
Copyright © 2011-2022 走看看