母函数模板

/*

母函数模板:有时候括号里的是无限个的话不需要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;

}

 

你可能感兴趣的:(函数)