普通母函数基础题。题意:对于整数拆分问题,4有如下几种拆法
4 = 4
4 = 3 + 1
4 = 2 + 2
4 = 2 + 1 + 1
4 = 1 + 1 + 1 + 1
其中3 + 1和1 + 3属于同一种拆法。
现在给你一个数,问这个数有几种拆法。
我的解题思路:普通母函数题,令数字为x的指数,那么可以构造出母函数(1 + x + x^2 + ...)(1 + x^2 + x^4 + ...)...,
算出母函数序列后,x^n的系数就是n能被拆分的方法数了。
我的解题代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
using namespace std;
const int N = 122;
int coe[N], tmp[N];
int n;
void Init();
int main()
{
Init();
while (~scanf("%d", &n))
{
if (n == 0) break;
printf("%d\n", coe[n]);
}
return 0;
}
void Init()
{
memset(coe, 0, sizeof(coe));
memset(tmp, 0, sizeof(tmp));
coe[0] = 1;
for (int i=1; i<N; ++i)
{
for (int j=0; j<=120; ++j)
{
for (int k=0; k<N; ++k)
{
if (k * i + j > 120) break;
tmp[k * i + j] += coe[j];
}
}
memcpy(coe, tmp, sizeof(coe));
memset(tmp, 0, sizeof(tmp));
}
return;
}