zoukankan      html  css  js  c++  java
  • ACM HDU 1028Ignatius 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): 4680    Accepted Submission(s): 3280


    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
     
     
     
    母函数:
     
    #include<stdio.h>
    #include<iostream>
    using namespace std;
    const int MAXN=120;
    int c1[MAXN+1],c2[MAXN+1];
    void calc()
    {
        int i,j,k;
        for(i=0;i<=MAXN;i++)
          {c1[i]=1;c2[i]=0;}
        for(k=2;k<=MAXN;k++)
        {
          for(i=0;i<=MAXN;i++)
            for(j=0;j+i<=MAXN;j+=k)
            {
                c2[i+j]+=c1[i];
            }  
          for(i=0;i<=MAXN;i++)
          {
              c1[i]=c2[i];
              c2[i]=0;
          }       
        }    
    } 
    int main()
    {
        int n;
        calc();
        while(cin>>n)
        {
            cout<<c1[n]<<endl;
        }   
        return 0; 
    }  
    

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    using namespace std;
    #define MAXN 121
    int c1[MAXN],c2[MAXN];//c1存放目前所有函数的乘积,c2存放两个函数的临时乘积
    int maxn;
    void mufun(int n)
    {
        int i,j,k;
        for(i=0;i<=n;i++)
        {
            c1[i]=1;
        }
        for(k=2;k<=n;k++)
        {
            for(i=0;i<=n;i++)
            {
                for(j=0;j+i<=n;j+=k)
                {
                    c2[i+j]+=c1[i];
                }    
            }
            for(i=0;i<=n;i++)
            {
                c1[i]=c2[i];
                c2[i]=0;
            }        
        }         
    }
    int main()
    {
        int n,i;
        while(scanf("%d",&n)!=EOF)
        //while(cin>>n[0]>>n[1]>>n[2])
        {
         
            memset(c1,0,sizeof(c1));
            memset(c2,0,sizeof(c2));
            mufun(n);
            printf("%d\n",c1[n]);   
        }
        return 0;    
    }      
    
  • 相关阅读:
    ARC108解题报告
    整体dp小结
    SAM学习笔记&AC自动机复习
    Error creating bean with name 'bootstrapImportSelectorConfiguration':
    responseBody
    无力回天的CSP2020
    NOIP2020游记
    2020国家集训队作业选做
    flutter开发使用AnnotatedRegion修改状态栏字体颜色,导致导航栏也变黑了的解决方法
    flutter使用InkWell点击没有水波纹效果的解决方法
  • 原文地址:https://www.cnblogs.com/kuangbin/p/2122192.html
Copyright © 2011-2022 走看看