母函数模版小结

下面是模板

#include<iostream>
using namespace std;

const int _max=10001;
int c1[_max],c2[_max];
int main()
{
int nNum;
int i,j,k;
while(cin>>nNum)
{
for(i=0;i<=nNum;++i)
{
c1[i]=1; //初始化系数都为1
c2[i]=0;
}

//总共有n个括号,从第2个起每一个括号都要和前面那一个括号相乘
//所以可以忽略第一个括号
for(i=2;i*i<=nNum;++i)
{
for(j=0;j<=nNum;++j) //j代表最前面这个大括号的项数
for(k=0;k+j<=nNum;k+=i*i) //在大括号后面,x都是以i方递增的
c2[j+k]+=c1[j]; //这里就是大括号后面的括号与前面相乘的计算
for(j=0;j<=nNum;++j)
{//算完以后都存在c2里面,所以要把值赋给c1
c1[j]=c2[j];
c2[j]=0;
}
}
cout<<c1[nNum]<<endl; //x^n的系数就代表和为n的组合数
}
return 0;
}

① 、首先对c1初始化,由第一个表达式(1+x+x^2+..x^n)初始化,把质量从0到n的所有砝码都初始化为1.

② 、 i从2到n遍历,这里i就是指第i个表达式,上面给出的第二种母函数关系式里,每一个括号括起来的就是一个表达式。

③、j 从0到n遍历,这里j就是(前面i個表达式累乘的表达式)里第j个变量,(这里感谢一下seagg朋友给我指出的错误,大家可以看下留言处的讨论)。如(1+x)(1+x^2)(1+x^3),j先指示的是1和x的系数,i=2执行完之后变为

(1+x+x^2+x^3)(1+x^3),这时候j应该指示的是合并后的第一个括号的四个变量的系数。

④ 、 k表示的是第j个指数,所以k每次增i(因为第i个表达式的增量是i)。

⑤ 、把c2的值赋给c1,而把c2初始化为0,因为c2每次是从一个表达式中开始的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值