【NeverGiveUp】

2019山东省赛加油! ! !;

HDU 1085 Holding Bin-Laden Captive! (母函数)

HDU 1085

学习母函数的时候看到这个题最水,就从他下手了,英语课看百度百科关于母函数的讲解,看的有点懵

母函数分两种:普通型生成函数,指数型生成函数,先从普通型生成函数开始

其实没有想象的那么复杂,之所以构建母函数,并且用多项式相乘的方式进行计算,推测大概就是因为指数进行运算时指数相加,指数模拟的是数的加法,而乘法有利于数的遍历,其中每个数的系数表示生成该指数的方式数,所以在我看来普通型生成函数就是一个简单的模拟过程,继续刷一刷题

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
using namespace std;
#define maxn 8 * 1000 + 5
int n1[maxn], n2[maxn];
int main()
{
    int val[3] = {1, 2, 5};
    int n[3];
    while(scanf("%d%d%d",&n[0],&n[1],&n[2]) != EOF)
    {
        if(n[0] == 0 && n[1] ==  0 && n[2] == 0) break;
        memset(n1, 0, sizeof(n1));//存放每一项前的系数,例如n1[5] = 2就代表x^5系数为2
        memset(n2, 0, sizeof(n2));//存放中间值
        int maxy = 0;
        for(int i = 0; i < 3; i ++)//计算理论最大数值
            maxy += n[i] * val[i];
        for(int i = 0; i <= n[0]; i ++)//预处理第一个多项式
            n1[i] = 1;
        for(int i = 1; i < 3; i ++)//遍历除第一个多项式外的所有多项式
        {
            for(int j = 0; j <= maxy; j ++)
            {
                if(n1[j])//如果存在该项
                {
                    for(int k = 0; k <= val[i] * n[i]; k += val[i])//模拟多项式相乘
                        if(j + k <= maxy)
                            n2[j + k] += n1[j];
                }
            }
            memcpy(n1, n2, sizeof(n1));//将结果存在n1中
            memset(n2, 0, sizeof(n2));//清空n2
        }
        int i;
        for(i = 0; i <= maxy; i ++)
        {
            if(!n1[i])
            {
                //flag = i;
                break;
            }
        }
        printf("%d\n",i);
    }
    return 0;
}

阅读更多
版权声明:弱鸡弱鸡弱的一匹 https://blog.csdn.net/qq_41444888/article/details/79979706
个人分类: 数论基础 母函数
上一篇Codeforces 906D(欧拉降幂定理? + 唯一分解定理)
下一篇EOJ 3536 蛇形矩阵
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭