找单词

Problem 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


母函数的基本操作
假设用x表示字母,x的指数表示总价值
可以得到
HDU 2082找单词——————最简单的母函数 :)_赋值个字母HDU 2082找单词——————最简单的母函数 :)_多项式_02 可以用多项式HDU 2082找单词——————最简单的母函数 :)_多项式_03
HDU 2082找单词——————最简单的母函数 :)_多项式_04个字母HDU 2082找单词——————最简单的母函数 :)_母函数_05 可以用多项式HDU 2082找单词——————最简单的母函数 :)_赋值_06
HDU 2082找单词——————最简单的母函数 :)_多项式_07个字母HDU 2082找单词——————最简单的母函数 :)_母函数_08 可以用多项式HDU 2082找单词——————最简单的母函数 :)_多项式_09
HDU 2082找单词——————最简单的母函数 :)_母函数_10
HDU 2082找单词——————最简单的母函数 :)_多项式_11个字母HDU 2082找单词——————最简单的母函数 :)_赋值_12 可以用多项式HDU 2082找单词——————最简单的母函数 :)_多项式_13

构造母函数如下:
HDU 2082找单词——————最简单的母函数 :)_赋值_14

可得到:
HDU 2082找单词——————最简单的母函数 :)_母函数_15

其中HDU 2082找单词——————最简单的母函数 :)_赋值_16i是价值,HDU 2082找单词——————最简单的母函数 :)_赋值_17是方案数

我们只需要统计HDU 2082找单词——————最简单的母函数 :)_母函数_18就能得出结果

#include<bits/stdc++.h>
using namespace std;
int C1[55];//系数;
int C2[55];//暂时存放

int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(C1,0,sizeof(C1));
memset(C2,0,sizeof(C2));
int num;C1[0]=1;
for(int i=1;i<=26;++i)
{
scanf("%d",&num);
if(!num) continue;
for(int j=0;j<51;++j)
for(int k=0;k<=num&&k*i+j<51;++k)//因为只要前五十项的系数...
C2[k*i+j] += C1[j];//对于每一个x^(k*i+1)项,它的系数都要加上前面与它相乘x^j项的系数
memcpy(C1,C2,sizeof(C2));//将C2赋值给C1
memset(C2,0,sizeof(C2));
}
int ans = 0;
for(int i=1;i<51;++i) ans += C1[i];
printf("%d\n",ans);
}
return 0;
}