HDOJ HDU 1028 Ignatius and the Princess III

HDOJ 1028 Ignatius and the Princess III

题目

点此查看 HDOJ 1028 Ignatius and the Princess III

分类

组合数学 母函数

题意

英雄 Ignatius 救 公主 的故事背景
本题是第三部分
求一个 数 的所有 展开式的数量
例如 :
4 有 4 种展开式
4 = 4;
4 = 3 + 1;
4 = 2 + 2;
4 = 2 + 1 + 1;
4 = 1 + 1 + 1 + 1;

题解

组合数学中的 组合问题
可以用 母函数的方法解

点此查看 百度百科 母函数
一种解决组合问题的方法
我的理解就是 把 组合问题 对应到 代数的系数幂运算 从而解决组合问题的方法
举例
用 指数的幂 表示 砝码的质量 系数表示 砝码的数量
x^2 = 1 * x^2 一个质量为2的砝码
1 = 1 * x^0 没有质量为 0 的砝码 所以可以理解为 没有砝码
1个1克的砝码可以用函数1+x表示
(1+)(1+x^2) = 1 + x + x^2 + x^3 一个 1 克的砝码 和 1个两克 的 砝码可以组成 1 个 1克、1 个 2克、1 个3克的

引出
使(1 + x^1 + x^2..+x^n) 表示 n 个 1 的序列
1 + x^2 + x^4 + x^6 + … x^2n
表示 n 个 2
(1 + x^1 + x^2..+x^n) * (1 + x^2 + x^4 + x^6 + … x^2n
) 的 解 每一项 a * x ^ b 表示 n 个 1 和 n 个 2 组成 的 b 有 a 个
故 (1 + x^1 + x^2..+x^n)(1 + x^2 + x^4 + x^6 + …)(1 + x^3 + x^6 +..)(..)(1 + x^n)
的 解中 b 可拆分种类数为 x^b的系数
贴一个带注释的代码 ,写的不错 点击查看 母函数解题代码

代码

#include <iostream>
#include <cstring>
#define max 125
#define nummax 120
using namespace std;

int res[max];
int t[max];

int main()
{
    int n;
    for(int i = 0;i < max;i++)
        res[i] = 1;    
    memset(t,0,sizeof(t));
    for(int i = 2;i <= nummax;i++)
    {
        for(int j = 0;j <= nummax;j++)
            for(int k = 0;k + j <= nummax;k += i)
            {
                t[j + k] += res[j];
            }    
        memcpy(res,t,sizeof(t));
        memset(t,0,sizeof(t));
    }
    while(cin >> n)
    {
        cout << res[n] << endl;
    }    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>