zoukankan      html  css  js  c++  java
  • [ACM] hdu 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): 11475    Accepted Submission(s): 8118


    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

    解题思路:

    想了好半天,终于把母函数理解的差不多了。不同的题目需要有不同的母函数,该题的母函数为

    (1+x+x^2+x^3...)     *    (1+x^2+x^4+x^6....)       *       (1+x^3+x^6+x^9.....)*(1+x^4+x^8+x^12.....)

      1选择0,1,2,3个等        2选择0,1,2,3个等                 3选择0,1,2,3个等  

    每个式子前面的1代表选择0个,即x^0

    每个数都可以取无穷多个。

    母函数的算法主要就是模拟手动计算多个式子相乘,记录的是每个指数的系数,比如 c[ 4 ]=2 指的是  x^4的系数为2 

    代码:

    #include <iostream>
    using namespace std;
    int c[121],temp[121];
    int n;
    
    int main()
    {
        while(cin>>n)
        {
            for(int i=0;i<=n;i++)//模拟多个式子相乘
            {
                c[i]=1;//c[]中一开始是第一个式子各个指数的系数,即(1+x+x^2+x^3...),都为1
                temp[i]=0;
            }
            for(int i=2;i<=n;i++)//表示和第几个式子相乘
            {
                for(int j=0;j<=n;j++)//c[]中每一项的指数
                    for(int k=0;k+j<=n;k+=i)//第i个式子中的每一项的指数
                        temp[j+k]+=c[j];//临时指数
                for(int j=0;j<=n;j++)
                {
                    c[j]=temp[j];//每乘完一个式子,两个式子相当于合并成一个式子,并把系数存到c[]中
                    temp[j]=0;
                }
            }
            cout<<c[n]<<endl;
        }
        return 0;
    }


     

    参考博客:http://www.wutianqi.com/?p=596

    贴一下模板:

    #include <iostream>
    using namespace std;
    // Author: Tanky Woo
    // www.wutianqi.com
    const int _max = 10001;
    // c1是保存各项质量砝码可以组合的数目
    // c2是中间量,保存没一次的情况
    int c1[_max], c2[_max];
    int main()
    {	//int n,i,j,k;
    	int nNum;   //
    	int i, j, k;
    
    	while(cin >> nNum)
    	{
    		for(i=0; i<=nNum; ++i)   // ---- ①
    		{
    			c1[i] = 1;
    			c2[i] = 0;
    		}
    		for(i=2; i<=nNum; ++i)   // ----- ②
    		{
    
    			for(j=0; j<=nNum; ++j)   // ----- ③
    				for(k=0; k+j<=nNum; k+=i)  // ---- ④
    				{
    					c2[j+k] += c1[j];
    				}
    			for(j=0; j<=nNum; ++j)     // ---- ⑤
    			{
    				c1[j] = c2[j];
    				c2[j] = 0;
    			}
    		}
    		cout << c1[nNum] << endl;
    	}
    	return 0;
    }


    自己手动模拟了一遍才弄懂这个模板的意思。

  • 相关阅读:
    pipelinewise 学习二 创建一个简单的pipeline
    pipelinewise 学习一 docker方式安装
    Supercharging your ETL with Airflow and Singer
    ubuntu中使用 alien安装rpm包
    PipelineWise illustrates the power of Singer
    pipelinewise 基于singer 指南的的数据pipeline 工具
    关于singer elt 的几篇很不错的文章
    npkill 一个方便的npm 包清理工具
    kuma docker-compose 环境试用
    kuma 学习四 策略
  • 原文地址:https://www.cnblogs.com/vivider/p/3697519.html
Copyright © 2011-2022 走看看