数论--母函数--hdu1246 自共轭Ferrers图

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;

}


猜你喜欢

转载自blog.csdn.net/sm_545/article/details/79682273