普通型母函数模板:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int c1[1000], c2[1000];
int val[1000],a[1000];
int main()
{
int n,i, j, k;
while(cin>>n)
{
//
//这一段根据题意处理,主要处理每种的数量和这一种的价值
memset(c1, 0, sizeof(c1));
memset(c2, 0, sizeof(c2));
for(i = 0; i <=n; ++i)//初始化第一个多项式
{
c1[i]=1;
}
for(i = 2; i <=17; i++)//化简过程
{
for(j = 0; j <=n; j++)
{
for(k = 0; j+ k<=n; k+=val[i])//这个循环的限制条件根据题意而变
{
c2[j + k] += c1[j];
}
}
for(j = 0; j <=n; ++j)
{
c1[j] = c2[j];
c2[j] = 0;
}
}
printf("%d\n",c1[n]);
}
return 0;
}
指数型母函数模板;
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int N = 100; double c1[N], c2[N],a[N]; int val[N]; void Factorial() { a[0]=1; a[1]=1; for(int i = 2; i <=20; i++) { a[i]=a[i-1]*i; } } int main() { int n, m, i, j, k; Factorial(); while(~scanf("%d%d", &n, &m)) { for(i = 0; i < n; ++ i) { scanf("%d", &val[i]); } memset(c1, 0, sizeof(c1)); memset(c2, 0, sizeof(c2)); for(i = 0; i <= val[0]; ++i) { c1[i] = 1.0/a[i]; } for(i = 1; i < n; i++) { for(j = 0; j <= m; ++j) { for(k = 0; k + j <= m && k <= val[i]; ++k) { c2[j + k] += c1[j]/a[k]; } } for(j = 0; j <= m; ++j) { c1[j] = c2[j]; c2[j] = 0; } } printf("%.0lf\n", c1[m]*a[m]); } return 0; }
一句话区分指数型母函数和母函数就是 母函数是组合数,,指数型母函数是排列数