1.
利用Ferrers图像可得关于整数拆分的几个结果。
(a)整数n拆分成最大数为k的拆分数,和数n拆分成k个数的和的拆分数相等。
解释:因整数n拆分成k个数的和的拆分可用一k行的图像表示。所得的Ferrers图像的共轭图像最上面一行有k个格子。
(b)整数n拆分成最多不超过m个数的和的拆分数,和n拆分成最大不超过m的拆分数相等。
(c)整数n拆分成
互不相同的若干奇数的和的拆分数
,和n拆分成
自共轭的Ferrers图像的拆分数相等
。
2.母函数和拆分数的关系
将n拆分为互不相同的奇数,的拆分数的个数。可以用母函数来求。
f(x) = (1 + x) * (1 + x ^ 3) * (1 + x ^ 5) * ... * (1 + x ^ (2k + 1) )
中n的系数就是n的自共轭Ferrers图像的个数。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 300 + 5;
typedef long long ll;
//
ll b[maxn],c[maxn];
void solve(int n)
{
memset(c, 0, sizeof(c));
c[0] = c[1] = 1ll;
for (int i = 3; i < maxn; i += 2) {//每次乘上(1 + x ^ i)
for (int j = 0; j < maxn; j ++) {//(b[0] * 1 + b[i] * x ^ i) * (c[0] * 1 +...+ c[j] * x ^ j + ...)
if(i + j < maxn) b[j + i] = c[j];
}
for (int j = 0; j < maxn; j ++) {
c[j] += b[j];
b[j] = 0;
}
}
}
int main()
{
int n;
while (scanf("%d",&n) != EOF) {
solve(n);
printf("%lld\n",c[n]);
}
return 0;
}