【总结】母函数在ACM上的应用

More details see :

http://blog.csdn.net/xiaofei_it/article/details/17042651

http://blog.sina.com.cn/s/blog_79b832820100x8pa.html

https://www.jianshu.com/p/c752969ddde1

一、普通母函数

普通母函数一般是解决类似下面这样的问题:

给10张1元,8张2元,7张5元,要得到35元,有多少种组合?

然后还可以添加各种条件,不细说了,很模板的一个东西

HDU1085 ↓

#include<bits/stdc++.h>
using namespace std;

const int v[] = {1,2,5};
int num[3],res[9999],tmp[9999];

int main(){
    while(cin >> num[0] >> num[1] >> num[2]){
        if(!num[0] && !num[1] && !num[2]) break;
        res[0] = 1;
        int last = 0;
        for(int i = 0;i < 3;++i){
            memset(tmp,0,sizeof tmp);
            for(int j = 0;j <= num[i];++j)
                for(int k = 0;k <= last;++k)
                    tmp[k+j*v[i]] += res[k];
            memcpy(res,tmp,sizeof tmp);
            last += num[i] * v[i];
        }
        for(int i = 0;i <= last + 1;++i) if(!res[i]){
            printf("%d
",i);
            break;
        }
    }

    return 0;
}

 若要改进时间效率,可以修改memset和memcpy以及for循环的终止条件。

二、指数型母函数

指数型母函数一般是解决类似下面这样的问题:

给几种物品,有的物品只能取偶数个,有的可以取任意个,取出的总数必须是m,问最后取出的物品的排列方案数有多少。

对应的母函数如下

然后可以进行各种变形,最后答案就是m!除以x^m的系数。

HDU2065 ↓

#include<bits/stdc++.h>
using namespace std;

typedef unsigned long long ull;
int MOD = 100;
int myPow(ull x,ull n){
    ull res = 1;
    x %= MOD;
    while(n){
        if(n & 1) res = (res * x) % MOD;
        x = (x * x) % MOD;
        n >>= 1;
    }
    return res;
}

int T;
ull n;

int main(){
    while(cin >> T){
        if(!T) break;
        for(int cas = 1;cas <= T;++cas){
            cin >> n;
            int ans = myPow(4,n-1) + myPow(2,n-1);
            printf("Case %d: %d
",cas,ans%100);
        }
        putchar('
');
    }

    return 0;
}
原文地址:https://www.cnblogs.com/doub7e/p/8547241.html