这是一道母函数的入门习题,新学的母函数,先做一题入门一下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;
}