hdu 1028 整数划分 (母函数)

假如输入4
4 = 4;
4 = 3 + 1;
4 = 2 + 2;
4 = 2 + 1 + 1;
4 = 1 + 1 + 1 + 1;
一共5种

假如输入3 用母函数的方法就是写成
(1+X+X2+X3)(1+X2)(1+X3) 展开后 求X3的系数

假如输入n
就是(1+X+X2+X3+X4....)(1+X2+X4+X6..)(1+X3+X6...)(....)

Sample Input
4
10
20

Sample Output
5
42
627

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <algorithm>
 5 # include <string>
 6 # include <cmath>
 7 # include <queue>
 8 # include <list>
 9 # define LL long long
10 using namespace std ;
11
12 int c1[10010], c2[10010] ;
13 int main()
14 {
15     //freopen("in.txt","r",stdin) ;
16     int nNum;
17     int i, j, k;
18
19     while(cin >> nNum)
20     {
21         for(i=0; i<=nNum; ++i)
22         {
23             c1[i] = 1;
24             c2[i] = 0;
25         }
26         for(i=2; i<=nNum; ++i)
27         {
28
29             for(j=0; j<=nNum; ++j)
30                 for(k=0; k+j<=nNum; k+=i)
31                 {
32                     c2[j+k] += c1[j];
33                 }
34                 for(j=0; j<=nNum; ++j)
35                 {
36                     c1[j] = c2[j];
37                     c2[j] = 0;
38                 }
39         }
40         cout << c1[nNum] << endl;
41     }
42     return 0;
43 }

时间: 2024-10-14 18:46:34

hdu 1028 整数划分 (母函数)的相关文章

hdu 1398 整数划分变形 (母函数)

有1,4,9,16,25.....2^17这么多面值的硬币,问任意给定一个不大于300的正整数面额,用这些硬币来组成此面额总共有多少种组合种数 比如10全14 + 6个 14+4+1+19+1 求(1+x+x^2+x^3+x^4+x^5+x^6+x^7+x^8+x^9+x^10)(1+x^4+x^8)(1+x^9)中x^10的系数即可 只是把模板的 i<=n改成了i*i<=n,在k遍历指数时把k=k+i变成了k=k+i*i Sample Input210300 Sample Output142

HDU 1028 整数划分问题 DP

http://acm.hdu.edu.cn/showproblem.php?pid=1028 将一个正整数n划分成多个正整数的和,例如4可以划分为4,1 + 3,2 + 2,1 + 1 + 2, 1 + 1 + 1(1 + 3和3 + 1算作一种划分). 在网上找到了两种做法 方法1: dp[i][j] 的含义是将一个正整数i划分为j个整数的和有几种分法.转移方程很好写但是不太好想. 将此划分分为两种情况,划分中包括1和不包括1.若划分中包括1,则只需将剩余的整数i - 1划分成j - 1个整数

hdu,1028,整数拆分的理解

#include"iostream"using namespace std;int main() { int n,i,j,k; int c[122],temp[122]; //c[] 数组用于储存当前多项式各项系数 //temp[]数组用于暂时储存在运算时的两多项式相加的系数和 while(cin>>n&&n!=0) { for(i=0;i<122;i++) //系数初始化,当前c[]所指的多项式是第一个多项式 {c[i]=1; temp[i]=0;}

hdu 5230 整数划分 dp

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5230 题意:给定n,c,l,r.求有多少种方法从1~n-1选取任意k数每个数的权重为其下标,使得这些数字之和加上c之后在l,r范围内. 题解:第一反应是计数01包,但是范围给定的n太大,TLE... 然后仔细想想,不就是求l~r范围内不重复的整数划分数嘛. dp[i][j]表示j这个数字,当前的拆分拥有i个拆分数时的方案数. 先考虑允许重复数字 : dp[i][j] = dp[i][j - i] + d

HDU acm1028 整数划分 递归问题(递推)

我们用递归+记忆化的方法来解决普通整数划分问题:定义 f(n,m)为将整数n划分为一系列整数之和,其中加数 最大不超过m. 得到下面的递推关系式: 当n==1 || m==1 只有一种划分,即 1 或者 1+1+1......+1 当m>n 显然,等价于 f(n,n) 当m==n 此时:我考虑加数包含m与否的两种情况: 1)划分不包含m,即f(n,m-1)---所有m-1的划分 2)划分包含 m,此时只有一种即 m 所以当m==n时,有 f(n,m)=f(n,m-1)+1 当m<n时, 1)包

hdu 1028 整数的划分问题

"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&l

整数划分母函数

http://acm.nyist.net/JudgeOnline/problem.php?pid=90 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include

hdu 1028 Ignatius and the Princess III —— 整数划分(生成函数)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1028 整数划分,每个数可以用无限次: 所以构造 f(x) = (1+x+x2+x3+...)(1+x2+x4+...)(1+x3+x6+...)...(1+xn) 乘起来后的 xn 的系数就是方案数: 用两个数组做即可,从第一个括号开始一个一个乘,f[i] 表示此时 xi 项的系数,后面每乘过来一个括号,相当于多了一种转移,所以加上. 代码如下: #include<iostream> #include

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(