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\n",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\n",cas,ans%100); } putchar('\n'); } return 0; }