hdu1398 Square Coins(母函数)

题目类似于整数拆分,很明显用母函数来做。

母函数的写法基本固定,根据具体每项乘式的不同做出一些修改就行了。它的思路是从第一个括号开始,一个括号一个括号的乘开,用c1数组保存之前已经乘开的系数,即c1[j]表示在之前已经乘开过的那些括号处理后x的j次方的系数,c2数组是一个临时更新的统计数组,每处理一个括号就更新一遍c1数组即可。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<cctype>
#include<sstream>
using namespace std;
#define pii pair<int,int>
#define LL long long int
const double eps=1e-10;
const int INF=1000000000;
const int maxn=300+10;
int c1[maxn],c2[maxn],n;
int main()
{
    //freopen("in1.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    for(int i=0;i<maxn;i++)
    {
        c1[i]=1;
        c2[i]=0;
    }//第一个括号已处理好

    for(int i=2;i<=17;i++)//顺次乘进后面的每个括号
    {
        for(int j=0;j<maxn;j++)//c1之前存储的每个j的值
        {
            for(int k=0;k+j<maxn;k+=i*i)//本括号内的指数
            {
                c2[k+j]+=c1[j];
            }
        }
        for(int j=0;j<maxn;j++)//更新存储的值
        {
            c1[j]=c2[j];
            c2[j]=0;
        }
    }
    while(scanf("%d",&n)==1&&n)
    {
        printf("%d
",c1[n]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zywscq/p/4275221.html