普通母函数基础题。把字母的价值作为x的指数然后就可以构造母函数为(1 + x + x^2 + ...)(1 + x^2 + x^4 + ...)...但是这里有一个需要注意的就是题目要求找到价值小于等于50的单词就行了,所以大于50的可以直接跳过。另外价值为0也就是没有英文字母这种不算单词。
解题代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
const int N = 51;
int coe[N], tmp[N];
int num[N];
void InitRead();
void Generate();
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
InitRead();
Generate();
}
return 0;
}
void InitRead()
{
memset(coe, 0, sizeof(coe));
memset(tmp, 0, sizeof(tmp));
coe[0] = 1;
for (int i=1; i<=26; ++i)
{
scanf("%d", &num[i]);
}
return;
}
void Generate()
{
for (int i=1; i<=26; ++i)
{
for (int j=0; j<=50; ++j)
{
if (coe[j] == 0) continue;
for (int k=0; k<=num[i]; ++k)
{
if (k * i + j > 50) break;
tmp[k * i + j] += coe[j];
}
}
memcpy(coe, tmp, sizeof(coe));
memset(tmp, 0, sizeof(tmp));
}
int ans = 0;
for (int i=1; i<=50; ++i) // 从1开始循环,不计算价值为0的次数
{
ans += coe[i];
}
printf("%d\n", ans);
return;
}