Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u

Submit Status

Description

假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,..... 字母Z的价值为26。那么,对于给定的字母,可以找到多少价值<=50的单词呢?单词的价值就是组成一个单词的所有字母的价值之和,比如,单词ACM的价值是1+3+14=18,单词HDU的价值是8+4+21=33。(组成的单词与排列顺序无关,比如ACM与CMA认为是同一个单词)。 
 

Input

输入首先是一个整数N,代表测试实例的个数。 
然后包括N行数据,每行包括26个<=20的整数x1,x2,.....x26. 
 

Output

对于每个测试实例,请输出能找到的总价值<=50的单词数,每个实例的输出占一行。
 

Sample Input

2
1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
9 2 6 2 10 2 2 5 6 1 0 2 7 0 2 2 7 5 10 6 10 2 10 6 1 9
 

Sample Output

7
379297
 

Source

2006/1/15 ACM程序设计期末考试
先说一下什么是母函数:传送门

生成函数,英文是Generating Function。恕本人不才,本文只介绍生成函数的其中一种用法。

生成函数是说,构造这么一个多项式函数g(x),使得x的n次方系数为f(n)。

对于母函数,我看到最多的是这样两句话:

1.“把组合问题的加法法则和幂级数的乘幂对应起来。”

2.“把离散数列和幂级数一 一对应起来,把离散数列间的相互结合关系对应成为幂级数间的运算关系,最后由幂级数形式来确定离散数列的构造。 “

其实这两句话我也不算太懂。先放这里,说不定以后可能会慢慢理解吧。

还是先举个大牛博客中的例子吧:

有1克、2克、3克、4克砝码各一枚,问你能称出哪几种重量?每种重量各有几种方案?

下面是用母函数解决这个问题的思路:

首先,我们用X表示砝码,X的指数表示砝码的重量。那么,如果用函数表示每个砝码可以称的重量,

1个1克的砝码可以用函数X^0 + X^1表示,

1个2克的砝码可以用函数X^0 + X^2表示,

依次类推。

如果我们把上面2个多项式相乘,可以得到X^0 + X^1 + X^2 + X^3。继续把它与X^0 + X^3相乘,得到X^0 + X^1 + X^2 + 2*X^3 + X^4 + X^5 + X^6。

聪明的你,是不是发现了什么?

如果没有,接着把它与X^0+X^4相乘,最后得到X^0 + X^1 + X^2 + 2*X^3 + 2*X^4 + 2*X^5 + 2*X^6 + 2*X^7 + X^8 + X^9 + X^10。

由于X的指数表示的是重量,所以,在相乘时,根据幂的运算法则(同底幂相乘,指数相加),得到的结果正是所有的方案。而且,每个X前面的系数代表它有几种方案。

真是神奇啊。。。。

需要注意的是,如果有2个1克的砝码,应该用X^0 + X^1 + X^2表示,而不是X^0 + 2*X^1。

母函数还可以解决其他问题,比如,整数划分。

整数划分是个很经典的问题,划分规则就不再细述,直接说思路。与上面的问题相比,每种砝码的个数不再是1个,而是无限个。于是,

1克的砝码可以用X^0 + X^1 + X^2 + X^3 ……表示,

2克的砝码可以用X^0 + X^2 + X^4 + X^6……表示,

3克的砝码可以用X^0 + X^3 + X^6 + X^9……表示,

依次类推。

相乘后求出X^n的系数,就是结果。

总而言之,解决此类问题,只要模拟好2个多项式相乘就好了。

大概思路是开2个数组,c1[ ]保存当前得到的多项式各项系数,c2[ ]保存每次计算时的临时结果,当每次计算完毕后,把它赋给c1,然后c2清零。

计算的时候,开3层for循环。最外层,记录它正在与第几个多项式相乘。第二层,表示c1中的每一项,第三层表示后面被乘多项式中的每一项。

代码注释写的很详细,很容易懂。

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int t,c1[],c2[],num[];
cin>>t;
while(t--)
{
memset(c1,,sizeof(c1));//c1[ ]保存当前得到的多项式各项系数
memset(c2,,sizeof(c2)); //c2[ ]保存每次计算时的临时结果
memset(num,,sizeof(num));
for(int i=;i<=;i++)
cin>>num[i];
c1[]=; //相当于用X^0去乘以后面的多项式
for(int i=;i<=;i++)//要乘以26个多项式
{for(int j=;j<=;j++)//c1的各项的指数
for(int k=;k<=num[i]&&j+k*i<=;k++)
//k*i表示被乘多项式各项的指数,(X^0*i + X^1*i + X^2*i + ……)
c2[j+k*i]+=c1[j];
//指数相加得j+k*i,加多少只取决于c1[j]的系数,因为被乘多项式的各项系数均为1
memcpy(c1,c2,sizeof(c1));
memset(c2,,sizeof(c2));}
int ans=;
for(int i=;i<=;i++)
ans+=c1[i];
cout<<ans<<endl;
}
return ;
}

HDU 2082 母函数模板题的更多相关文章

  1. HDU 2079 选课时间(母函数模板题)

    链接:传送门 思路:母函数模板题 /************************************************************************* > Fil ...

  2. HDU 2138 Miller-Rabin 模板题

    求素数个数. /** @Date : 2017-09-18 23:05:15 * @FileName: HDU 2138 miller-rabin 模板.cpp * @Platform: Window ...

  3. hdu1521 排列组合 指数型母函数模板题

    排列组合 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  4. HDU1028 Ignatius and the Princess III 【母函数模板题】

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  5. HDU2082母函数模板题

    找单词 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  6. HDU 1392 凸包模板题,求凸包周长

    1.HDU 1392 Surround the Trees 2.题意:就是求凸包周长 3.总结:第一次做计算几何,没办法,还是看了大牛的博客 #include<iostream> #inc ...

  7. HDU 2586 (LCA模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2586 题目大意:在一个无向树上,求一条链权和. 解题思路: 0 | 1 /   \ 2      3 ...

  8. HDU 2087 kmp模板题

    s为主串 t为模板串 求t的nextt 加const #include<stdio.h> #include<string.h> #include<algorithm> ...

  9. 【网络流#3】hdu 1532 - Dinic模板题

    输入为m,n表示m条边,n个结点 记下来m行,每行三个数,x,y,c表示x到y的边流量最大为c 这道题的模板来自于网络 http://blog.csdn.net/sprintfwater/articl ...

随机推荐

  1. UVa 437 The Tower of Babylon

    Description   Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of ...

  2. bzoj1069 SCOI2007 最大土地面积

    1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 2560  Solved: 983 Description ...

  3. Chkrootkit Sourcecode Learning

    目录 . Chkrootkit Introduce . Source Code Frame . chklastlog.c . chkwtmp.c . ifpromisc.c . chkproc.c . ...

  4. 《驾驭Core Data》 第一章 Core Data概述

    <驾驭Core Data>系列教程综合了<Core Data for iOS>,<Learning Core Data for iOS>,<Core Data ...

  5. POJ 1789Truck History(pirme)

    Truck History Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 22648   Accepted: 8781 De ...

  6. vs------安装window net.framework 出现严重错误解决方法

    打开system32和SysWOW64修改里面共六个msvcr100_clr0400.dll文件的名字除了带120的文件不用修改 需要修改管理员权限: 步骤:属性->安全->编辑-> ...

  7. 批处理:echo的用法

    批处理:echo的用法 若要用 echo 命令显示一条命令,可用下述语法:  echo [message] 参数 ON|OFF   指定是否允许命令的回显.若要显示当前的 ECHO 的设置,可使用不带 ...

  8. Matalab IFS分形算法

    IFS 算法代码 function IFS_draw(M,p) N=; :length(p); eval(['a',num2str(k),'=reshape(M(',num2str(k),',:),2 ...

  9. mybatis中的resultMap

    resultMap <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBL ...

  10. Google搜索命令语法大全

    以下是目前所有的Google搜索命令语法,它不同于Google的帮助文档,因为这里介绍 了几个Google不推荐使用的命令语法.大多数的Google搜索命令语法有它特有的使用格式,希望大家能正确使用. ...