/* 母函数模板:有时候括号里的是无限个的话不需要n[],或直接和第i个括号有关系时不用c[],如最简答的变形题只改成i*i那题。 c[],n[]用于有限个的时候。 */ #include <set> #include <map> #include <list> #include <cmath> #include <ctime> #include <deque> #include <queue> #include <stack> #include <cstdio> #include <string> #include <vector> #include <cctype> #include <cstring> #include <sstream> #include <fstream> #include <cstdlib> #include <cassert> #include <iostream> #include <algorithm> using namespace std; //Constant Declaration /*--------------------------*/ //#define LL long long #define LL __int64 const int M=200; const int INF=1<<30; const double EPS = 1e-11; const double PI = acos(-1.0); /*--------------------------*/ // some essential funtion /*----------------------------------*/ void Swap(int &a,int &b){ int t=a;a=b;b=t; } int Max(int a,int b){ return a>b?a:b; } int Min(int a,int b){ return a<b?a:b; } int Gcd(int a,int b){ while(b){b ^= a ^=b ^= a %= b;} return a; } /*----------------------------------*/ //for (i = 0; i < n; i++) /*----------------------------------*/ int c1[M], c2[M]; int c[200] = {0,}, n[200]; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int t, case1 = 0; //scanf("%d", &t); //int n, m; int i, j, k; //scanf("%d%d", &n, &m); int num; int sum; scanf("%d", &t); while (t--) { scanf("%d",&num); memset(c2, 0, sizeof(c2)); memset(c1, 0, sizeof(c1)); for (i = 0;/*可加(i <= 最大指数 &&)*/ i <= c[1] * n[1]; i += c[1])//开始时的第一个括号 { c1[i] = 1; } for (i = 2; i <= /*共几个括号,既共几种*/ ; i++) { for (j = 0; j <= /*最大指数*/num; j++)//每次计算后的第一个括号 { for (k = 0; k + j <= /*最大指数*/num && /*该括号最大的一个数*/k <= c[i] * n[i]; k += c[i])//每次计算后的第二个括号 { c2[k + j] += c1[j];//因为后面的系数必定是1 } } for (j = 0; j <=/*最大指数*/num ; j++) { c1[j] = c2[j]; c2[j] = 0; } } printf("%d\n", c1[num]); } return 0; }