hdu1028Ignatius and the Princess III(最基础的母函数模板)

来源:互联网 发布:网络合同 编辑:程序博客网 时间:2024/05/16 17:09

母函数也就是多项式乘积,某个数n,求能由1~n-1有多少种组成方法。

经典例题:

Ignatius and the Princess III

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


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
41020
 


 

Sample Output
542627

以四为例可以看做多项式乘积即:(1+x+x^2+x^3+x^4)*(1+x^2+x^4)*(1+x^3)

只需按照数学方法来实现编程即可。

代码:

#include<stdio.h>
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
                          int i,j,k;
                          int c1[150],c2[150];
                          for(i=0;i<=n;i++)
                          {
                                           c1[i]=1;//代表第j项的系数
                                           c2[i]=0;
                          }//把全部的系数都初始化
                          for(i=2;i<=n;i++)//i代表的是第几个多项式
                          {
                                           for(j=0;j<=n;j++)//j代表是第一个多项式的第几项
                                           for(k=0;k+j<=n;k+=i)//j+k是后项与第一项相乘的指数和,用j+k<=n来限制指数不能大于题目要求的数值;
                                           {
                                                   c2[j+k]+=c1[j];//j+k代表的是某项的指数           
                                           }
                                           for(j=0;j<=n;j++)
                                           {
                                                            c1[j]=c2[j];
                                                            c2[j]=0;
                                           }
                          }
                          printf("%d\n",c1[n]);
    }
    return 0;
}

类似题目:

1398

Square Coins

People in Silverland use square coins. Not only they have square shapes but also their values are square numbers. Coins with values of all square numbers up to 289 (=17^2), i.e., 1-credit coins, 4-credit coins, 9-credit coins, ..., and 289-credit coins, are available in Silverland.
There are four combinations of coins to pay ten credits:

ten 1-credit coins,
one 4-credit coin and six 1-credit coins,
two 4-credit coins and two 1-credit coins, and
one 9-credit coin and one 1-credit coin.

Your mission is to count the number of ways to pay a given amount using coins of Silverland.
 


 

Input
The input consists of lines each containing an integer meaning an amount to be paid, followed by a line containing a zero. You may assume that all the amounts are positive and less than 300.
 


 

Output
For each of the given amount, one line containing a single integer representing the number of combinations of coins should be output. No other characters should appear in the output.
 


 

Sample Input
210300
 


 

Sample Output
1427

AC代码:

#include<stdio.h>
int main()
{
    int n;
    while(~scanf("%d",&n)&&n!=0)
    {
                                int i,j,k;
                                int c1[310];
                                int c2[310];
                                for(i=0;i<=n;i++)
                                {
                                                 c1[i]=1;
                                                 c2[i]=0;
                                }
                                for(i=2;i*i<=n;i++)
                                {
                                                   for(j=0;j<=n;j++)
                                                   for(k=0;k+j<=n;k=k+i*i)//把i换成i*i即可
                                                   {
                                                                          c2[j+k]+=c1[j];
                                                   }
                                                   for(j=0;j<=n;j++)
                                                   {
                                                                    c1[j]=c2[j];
                                                                    c2[j]=0;
                                                   }
                                }
                                printf("%d\n",c1[n]);
    }
    return 0;
}

0 0
原创粉丝点击