题目链接:

​http://acm.hdu.edu.cn/showproblem.php?pid=1398​


题目大意:

Silverland居住的人们使用方币,这种硬币的价值都是平方数。硬币的价值分别为1分、4分、9分,

…,最大为289(17^2)分。要得到10分钱,共有四种硬币组合

10个1分硬币、1个4分硬币和6个1分硬币、2个4分硬币和2个1分硬币,1个9分硬币和1个1分硬币。

现在给你一个数,问:得到这个值,共有多少种不同的硬币组合方式。


思路:

典型的母函数问题。

可列出母函数 g(x) = (1+x+x^2+x^3+…)*(1+x^4+x^8+…)*…*(1+x^289+x^578+…),用母函

数模板​求出x^n的系数即可。


AC代码:


#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;

int c1[310],c2[310];
int Elem[18] ={1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289};

int main()
{
int N;
while(cin >> N && N)
{
for(int i = 0; i <= N; ++i)
{
c1[i] = 1;
c2[i] = 0;
}
for(int i = 2; i <= 17; ++i)
{
for(int j = 0; j <= N; ++j)
{
for(int k = 0; k + j <= N; k += Elem[i-1])
{
c2[k+j] += c1[j];
}
}
for(int j = 0; j <= N; ++j)
{
c1[j] = c2[j];
c2[j] = 0;
}
}
cout << c1[N] << endl;
}

return 0;
}