HDU 2082 找单词 --- 母函数

HDU 2082 找单词

起码通过这题,知道了母函数是什么东西,值得一做。

/* 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\n", cnt);
    }//while(t)

    return 0;
}
View Code

 

你可能感兴趣的:(HDU 2082 找单词 --- 母函数)