这题很好玩。首先科普一下母函数。
链接:https://blog.csdn.net/dgq8211/article/details/7385718
然后这道题就很简单啦。认为每个字母为响应的砝码价值和砝码数量。能够组合的单词价值就是砝码重量组合。那么就相当于求多项式函数(如果有多个砝码例如三个价值三的也就是3个c就乘以
x^0+
x^3
+x^6
(好像放一起格式有问题,所以大家将就着看意思懂就行))
那最后模拟一下多项式相乘就可以了。
外层i为第几个多项式
内层j为c1(不断更新的多项式)的各项系数(j为次数)
最内层 k * i为c2的各项系数( k * i为次数)k为第几个项
最后多项式各个系数相加为答案(第一个不算,0就代表没砝码没英文字母不算单词)
#include<bits/stdc++.h>
using namespace std;
int c1[55],c2[55],number[55];
const int basenumber=26;
int main() {
int n;
cin >> n;
while (n--) {
memset(c1, 0, sizeof(c1));
memset(c2, 0, sizeof(c2));
for (int i = 1; i <= basenumber; i++)
cin >> number[i];
c1[0] = 1;
for (int i = 1; i <= basenumber; i++) {
for (int j = 0; j <= 50/*这里是有后面约束其他题目change*/; j++)
for (int k = 0; k <= number[i] && j + k * i <= 50; k++) {
c2[j + k * i] += c1[j];
}
memcpy(c1, c2, sizeof(c2));
memset(c2, 0, sizeof(c2));
}
int ans = 0;
for (int i = 1; i <= 50; i++)ans += c1[i];
cout << ans << endl;
}
}
这个可作为算各个数据加和有多少组的板子,也可做特殊多项式相乘的板子