例题链接:HDU2082:https://vjudge.net/problem/HDU-2082
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <sstream> #include <map> #include <set> #include <queue> #include <stdlib.h> #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); using namespace std; typedef long long ll; int a[100]; //对应价值的系数 int b[100]; //当有系数要跟新时,用b数组进行暂时储存 //解题思路:母函数,用指数代表价值,价值又为数组的下标,用系数代表组成该价值的方案组,方案组为数组中存的值 //价值不大于50!!!!!!,求x50次幂前的系数和就可以了 void init() { for (int i=0;i<=50;i++) { a[i]=0; b[i]=0; } } int main() { int n; cin >> n; while(n--) { init(); //初始化,使a,b数组均等于0 a[0]=1; int num; for (int i=1;i<=26;i++) //一共26个变量,(i代表价值)如果num==0,直接continue { cin >> num; if(num==0) continue; for (int j=0;j<=50;j++) // j就是前面i个表达式累乘得到的表达式里第j个变量 -》 1 + a[1]x^1 + a[2]x^2 + a[3]x^3 + a[4]x^4 ~~~~ a[50]x^50 { for (int k=0; k<=num && k*i+j<=50; k++) //k表示的是第j个指数,所以k每次增i { b[k*i+j]+=a[j]; } } for (int j=0;j<=50;j++) { a[j]=b[j]; //这里一定要注意,是=,不是+=,因为新的多项式跟新后,原来的多项式的系数就没了(新的多项式系数是1) b[j]=0; } } int ans=0; for (int i=1;i<=50;i++) { ans+=a[i]; //当价值(i)在1~50时,加上前面的系数(个数) } cout << ans << endl; } return 0; }