【生成函数】浅析入门

根据博客补充理解,小白一只

https://blog.csdn.net/howardemily/article/details/75041523

思想

1.“把组合问题的加法法则和幂级数的乘幂对应起来”

2.“母函数的思想很简单 —就是把离散数列和幂级数一一对应起来,把离散数列间的相互结合关系对应成为幂级数间的运算关系,最后由幂级数形式来确定离散数列的构造. “

#include<cstdio>
#include<cstring>
using namespace std;  
//   每一个括号括起来的就是一个表达式
// sup是保存多项式的数组,sup[n]中的值代表x^n的系数
// temp是临时多项式,保存相乘的临时中间情况  
int sup[1000], temp[1000];   
/*
程序始终只计算两个多项式之间的乘积,多个多项式的情况
先计算前两个的乘积,将结果作为第一个多项式,再与第三个相乘
依次类推,sup始终存放当前运算后的结果然后作为被乘多项式,
*/  
int main()  
{   
    int n;   //  目标 相当于x^n(指数)
    int i, j, k;  
    printf("输入指数:");
    while(scanf("%d",&n)!=EOF)  
    {  
        for(i=0; i<=n; ++i)     
        {  
            sup[i] = 1;   
//初始化第一个多项式,也就是用1g砝码的多项式,
//注意如果题目没给1g的砝码那么就不能++i,而要加上砝码的质量
            temp[i] = 0;  
//将临时区清空,无论第一个多项式质量是几都要全部置零
        }  
        for(i=2; i<=n; ++i)   
// 生成后续的第i个表达式,此题中是2g,i从2开始。(第i个表达式)(1+x+x^2+..x^n)
//如果砝码的值不是规律增长,i可能需要取决于输入
        {  
   
            for(j=0; j<=n; ++j)   

// 遍历当前结果表达式的每一项(当前表达式的第j项)与第i个表达式相乘,
//j从0到n遍历,这里j就是(前面几个表达式累乘的表达式)里第j个变量,
//如(1+x)(1+x^2)(1+x^3),j先指示的是1和x的系数,i=2执行完之后变为(1+x+x^2+x^3)(1+x^3),
//这时候j应该指示的是合并后的第一个括号的四个变量的系数。

               for(k=0; k+j<=n; k+=i)
               //第i个表达式的呈现
// k表示的是第j个指数,所以k每次增i(因为第i个表达式的增量是i)。
                {  
                    temp[j+k] += sup[j];  
//幂运算
                }  
            for(j=0; j<=n; ++j)    

// 将临时的结果覆盖当前结果,同时把临时结果置零,为下次做准备
            {  
                sup[j] = temp[j];  
                temp[j] = 0;  
            }  
        }  

        printf("输出方案结果:");
        printf("%d\n",sup[n]);  //输出结果
    }  
    return 0;  

HDU基础题目

(相应题目解析均在相应的代码里分析)

1.  模板题目:http://acm.hdu.edu.cn/showproblem.php?pid=1028

代码:http://www.wutianqi.com/?p=587

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值