题目链接:
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+…),用母函
数模板http://blog.csdn.net/lianai911/article/details/45567595求出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; }
时间: 2024-10-10 07:17:23