hdu1028 Ignatius and the Princess III (母函数习题)

10 篇文章 0 订阅
9 篇文章 0 订阅

Describe~

 

这是一道母函数的入门习题,新学的母函数,先做一题入门一下ww。

emm当然英文我是懒得看的啦qwq

题目大意:问n有多少种不同的分法。

这个题目大意好草率啊...那么举个例子:

4=4;

4=3+1;

4=2+2;

4=2+1+1;

4=1+1+1+1;

前后顺序改变不算不同种。

这题其实大可不用母函数,一个很简单的dp就可以解决问题了啦。

 

这里就讲一下母函数做法。

母函数一开始听真的感觉好懵逼啊(都不知道是用来干嘛的

 

换一种形式介绍母函数,也叫生成函数。

有4种blabla,从中选出n个blabla。要求第一种blabla的个数是偶数,第二种的个数是五的倍数,第三种最多取3个,第四种要么不取,要么取一个,问有多少种取法。怎么感觉是小学生题啊hhhh。

 

然而呢,n是高精度级别哒!

下面用生成函数来做,四种blabla,分别对应四个生成函数,答案就是四个生成函数乘起来,x^n的系数。

 

下面就直接讲这道题。

相当于有n种blabla,然后取出来和为n。

1对应的母函数为(1+x+x^2+x^3+...)

2对应的母函数为(1+x^2+x^4+x^6+...)

然后将他们乘起来!

我们关心的是x^n的系数。考虑x^n的组成,就可以进行dp。

 

 

 

 

//Suplex
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 1000
using namespace std;
int n,f[N],tmp[N];

int main()
{
	while(scanf("%d",&n) != EOF){
		for(int i=0;i<=n;i++) f[i]=1,tmp[i]=0;
		for(int i=2;i<=n;i++){
			for(int j=0;j<=n;j++)
				for(int k=0;k<=n-j;k+=i) tmp[j+k]+=f[j];
			for(int j=0;j<=n;j++) f[j]=tmp[j],tmp[j]=0;
		}
		printf("%d\n",f[n]);
	}
	return 0;
}

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值