起码通过这题,知道了母函数是什么东西,值得一做。
/* HDU 2082 找单词 --- 母函数 */ #include <cstdio> #include <cstring> const int N = 50; int num[30], c1[N + 10], c2[N + 10]; int main() { #ifdef _LOCAL freopen("D:\input.txt", "r", stdin); //文件流重定向; //freopen("D:\output.txt", "w", stdout); #endif int t; scanf("%d", &t); while (t--){ for (int i = 1; i <= 26; ++i){ scanf("%d", num + i); } memset(c1, 0, sizeof c1); //c1保存已经算得的各指数的系数 memset(c2, 0, sizeof c2); //c2用于保存c1*一个新的多项式后的系数,乘完赋值给c1并清零 c1[0] = 1; //X^0去乘后面的多项式 //(X^0)*(X^0+X^1+X^2+X^3+...)*(X^0+X^2+X^4+X^6+...)*...*(X^0+X^26+X^52+X^78...) //目的是算这个式子乘积的各个指数的系数, 题目要求只要小于等于50的即可 for (int i = 1; i <= 26; ++i){ //要乘以26个多项式,每个多项式有num[i]+1项 for (int j = 0; j <= N; ++j){ for (int k = 0; k <= num[i] && (j + k*i <= N); ++k){ //相当于使用了k个指数为i的式子的乘积(因此指数为k*i) //例:i=2时,单个指数为i,共有num[i]个指数为i的式子,我们可以使用k个(k=0,1,2...num) //这样得到的要乘以原式子的多项式指数分别是0,2,4,6...num*2; //用这个新的多项式乘以原来已经取得的结果 指数为k*i c2[j + k*i] += c1[j]; //新结果的指数是在原有指数的基础上加上新乘的多项式;是每个位置i都要乘一遍所有能取得的多项式(因此是两层循环) }//for(k) }//for(j) for (int j = 0; j <= N; ++j){ c1[j] = c2[j]; c2[j] = 0; } }//for(i) int cnt = 0; for (int i = 1; i <= N; ++i){ cnt += c1[i]; } printf("%d ", cnt); }//while(t) return 0; }