*HDU 1028 母函数

Ignatius and the Princess III

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

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 /*//整数拆分模板
 2 #include <iostream>
 3 using namespace std;
 4 const int lmax=10000;
 5 //c1是用来存放展开式的系数的,而c2则是用来计算时保存的,
 6 //他是用下标来控制每一项的位置,比如 c2[3] 就是 x^3 的系数。
 7 //用c1保存,然后在计算时用c2来保存变化的值。
 8 int c1[lmax+1],c2[lmax+1];
 9 int main()
10 {
11             int n, i, j, k ;
12            // 计算的方法还是模拟手动运算,一个括号一个括号的计算,
13            // 从前往后
14            while ( cin>>n )
15
16           {
17                      //对于 1+x+x^2+x^3+ 他们所有的系数都是 1
18                      // 而 c2全部被初始化为0是因为以后要用到 c2[i] += x ;
19                      for ( i=0; i<=n; i++ )
20
21                      {
22                                 c1[i]=1;
23                                 c2[i]=0;
24                      }
25                       //第一层循环是一共有 n 个小括号,而刚才已经算过一个了
26                       //所以是从2 到 n
27                      for (i=2; i<=n; i++)
28
29                    {
30                                  // 第二层循环是把每一个小括号里面的每一项,都要与前一个
31                                  //小括号里面的每一项计算。
32                                 for ( j=0; j<=n; j++ )
33                                  //第三层小括号是要控制每一项里面 X 增加的比例
34                                  // 这就是为什么要用 k+= i ;
35                                          for ( k=0; k+j<=n; k+=i )
36
37                                         {
38                                                  // 合并同类项,他们的系数要加在一起,所以是加法,呵呵。
39                                                  // 刚开始看的时候就卡在这里了。
40                                                  c2[ j+k] += c1[ j];
41                                          }
42                                // 刷新一下数据,继续下一次计算,就是下一个括号里面的每一项。
43                               for ( j=0; j<=n; j++ )
44
45                               {
46                                           c1[j] = c2[j] ;
47                                           c2[j] = 0 ;
48                               }
49                    }
50                     cout<<c1[n]<<endl;
51         }
52          return 0;
53 }
 1 #include<bits\stdc++.h>
 2 using namespace std;
 3 int c1[123],c2[123];
 4 void solve()
 5 {
 6     for(int i=0;i<=120;i++)
 7     {
 8         c1[i]=1;
 9         c2[i]=0;
10     }
11     for(int k=2;k<=120;k++)
12     {
13         for(int i=0;i<=120;i++)
14         for(int j=0;j+i<=120;j+=k)
15         c2[j+i]+=c1[i];
16         for(int i=0;i<=120;i++)
17         {
18             c1[i]=c2[i];
19             c2[i]=0;
20         }
21     }
22 }
23 int main()
24 {
25     int n;
26     solve();
27     while(scanf("%d",&n)!=EOF)
28     {
29         printf("%d\n",c1[n]);
30     }
31     return 0;
32 }
时间: 2024-11-05 03:11:37

*HDU 1028 母函数的相关文章

hdu 1028 Ignatius and the Princess III(母函数,完全背包)

http://acm.hdu.edu.cn/showproblem.php?pid=1028 整数划分问题. 第一道母函数...母函数入门 小于等于n的整数共有n个,1,2......n,每个数都有无限多个,对于整数1,它所对应的母函数为(1+x+x^2+...+x^k+...),整数2对应的母函数为(1+x^2+X^4+...+x^(2*k)+...),整数3对应的母函数为(1+x^3+x^6+...+x^(3*k)+...),以此类推,直到整数n. 那么n的整数划分的个数就是这n个母函数乘积

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): 15730    Accepted Submission(

hdu 1028 Ignatius and the Princess III 简单dp

题目链接:hdu 1028 Ignatius and the Princess III 题意:对于给定的n,问有多少种组成方式 思路:dp[i][j],i表示要求的数,j表示组成i的最大值,最后答案是dp[i][i].那么dp[i][j]=dp[i][j-1]+dp[i-j][i-j],dp[i][j-1]是累加1到j-1的结果,dp[i-j][i-j]表示的就是最大为j,然后i-j有多少种表达方式啦.因为i-j可能大于j,这与我们定义的j为最大值矛盾,所以要去掉大于j的那些值 /*******

Square Coins (HDU 1398) ———母函数模板详解

Square Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7748    Accepted Submission(s): 5238 Problem Description People in Silverland use square coins. Not only they have square shapes but

ACM: HDU 1028 Ignatius and the Princess III-DP

HDU 1028 Ignatius and the Princess III Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description "Well, it seems the first problem is too easy. I will let you know how foolish you are later." feng5166 says. &qu

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): 12731    Accepted Submission(s): 8999 Problem Description "Well, it seems the first problem is too easy. I will let

HDU1171 Big Event in HDU 【母函数】

Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 22835    Accepted Submission(s): 8018 Problem Description Nowadays, we all know that Computer College is the biggest department

hdu 2082 母函数

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2082 找单词 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4035    Accepted Submission(s): 2887 Problem Description 假设有x1个字母A, x2个字母B,..... x26个字母Z,

hdu 1171 Big Event in HDU(母函数)

链接:hdu 1171 题意:这题可以理解为n种物品,每种物品的价值和数量已知,现要将总物品分为A,B两部分, 使得A,B的价值尽可能相等,且A>=B,求A,B的价值分别为多少 分析:这题可以用母函数的思想解,不过求的不是方案数,而是判断尽可能接近总价值的一半的方案是否存在. 也可以用背包思想,每种物品的价值和数量已知,可以将总价值的一半作为容量,求最大价值,也就最接近所求值了 注:数组要开的稍微大一点,否则可能WA #include<stdio.h> #include<strin