zoukankan      html  css  js  c++  java
  • 【总结】母函数在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;
    }
  • 相关阅读:
    闲谈系列之一——数据库主键GUID
    一个简单通用权限管理系统,求各位帮忙看看
    php 计算指定年份的周总数与及第几周的开始日期和结束日期(从周一开始)
    创建虚拟机流程详细过程链接
    阿里云CDN加速设置
    sublime Text3 快捷键
    Linux命令(centos7)
    分布式数据库
    mysql 分区和分表
    Linux crontab 命令格式与详细例子
  • 原文地址:https://www.cnblogs.com/doub7e/p/8547241.html
Copyright © 2011-2022 走看看