HDU1398 Square Coins【母函数】
原创
©著作权归作者所有:来自51CTO博客作者ITCharge的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目链接:
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;
}