来源:http://acm.hdu.edu.cn/showproblem.php?pid=2082
qscvideo讲解:https://www.bilibili.com/video/av4356817/
母函数 也就是所谓的生成函数
通过(1+x)(1+x+x2)将排列组合问题 换成求多项式系数的问题? 大概是这样子的吧
#include<bits/stdc++.h> using namespace std; int s[30],s1[60],s2[60]; void init() { for(int i=0;i<60;i++) s1[i] = s2[i] =0; } int main () { int t; scanf("%d",&t); while(t--) { init(); for(int i=1;i<=26;i++) scanf("%d",&s[i]); s1[0] = 1;//因为不论多少1相乘都是1 for(int i=1;i<=26;i++) { for(int j=0;j<=50;j++) { for(int k=0;k<=s[i] && k*i+j<=50;k++) { s2[k*i+j] += s1[j];//s1存储每个多项式相乘的结果,s2存储每次相乘的中间结果 } } for(int j=0;j<=50;j++) { s1[j] = s2[j]; s2[j] = 0; } } int res =0; for(int i=1;i<=50;i++) res+=s1[i]; printf("%d ",res); } }