码迷,mamicode.com
首页 > 其他好文 > 详细

HDU1398 Square Coins【母函数】

时间:2015-05-14 23:55:39      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

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;
}


HDU1398 Square Coins【母函数】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/45727359

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!