例题链接: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;
}


京公网安备 11010502036488号