从hdu 1028 Ignatius and the Princess III看母函数

题目链接

母函数一般用于排列组合问题。

对于一般组合问题,序列{ai}的生成函数为:a0 + a1 * x + a2 * x ^ 2 + a3 * x ^3 + .....

对于排列问题,需要定于另外一种指数生成函数:


对于一般组合问题,如hdu 1028 Ignatius and the Princess III

该题的母函数为

(1+x+x^2+x^3...) * (1+x^2+x^4+x^6....)  * (1+x^3+x^6+x^9.....) * (1+x^4+x^8+x^12.....)

其解就是 x ^ n 的系数。啊噢,为什么,给个链接吧:传送门

至于把多项式解出来,也是有技巧的,见代码:

#include<stdio.h>
int m1[124],m2[124];//m1[i]记录x次数位i的系数,m2[]是一个中转的便于计算 
void mn( int n )
{
	for( int i = 0; i <= n; ++i )
	{
		m1[i] = 1;
		m2[i] = 0;
	}
	for( int i = 2; i <= n; ++i ) //难点
	{//总共有n个括号,从第2个起每一个括号都要和前面那一个括号相乘
	//所以可以忽略第一个括号 
		for( int j = 0; j <= n; ++j )//j代表最前面这个大括号的项数 
			for( int k = 0; k + j <= n; k += i )//在大括号后面,x都是以i方递增的 
				m2[j + k] += m1[j];//这里就是大括号后面的括号与前面相乘的计算 
		for( int j = 0; j <= n; ++j )
		{//算完以后都存在m2里面,所以要把值赋给m1, 
			m1[j] = m2[j];
			m2[j] = 0;
		}
	}
}
int main( )
{
	mn( 123 );
	int n;
	while( scanf( "%d",&n ) != EOF )
		printf( "%d\n",m1[n] );//x^n的系数就代表和为n的组合数 
	return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值