母函数
以几个几克砝码为例
1+x^2+x^4表示有2个2g砝码
1+x^3+x^6表示2个3g砝码
1+x^3+x^6+ x^9表示有3个3g砝码
问这些砝码有几种不一样的重量
f ( x ) = (1+x^2+x^4)×(1+x^3+x^6)×(1+x^3+x^6+ x^9)
得出结果有几个x就有几种不一样的重量
hdu2082典型的母函数问题
代码如下
#include <bits/stdc++.h> using namespace std; typedef long long LL; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int N; scanf("%d",&N); LL a[60], b[60];//存放的是系数 while(N--) { int num; int i, j, k; for(i = 0; i <= 60; i++) { a[i] = b[i] = 0; } a[0] = 1; for(i = 1; i <= 26; i++) { scanf("%d",&num); if(num == 0) continue; for(j = 0; j <= 50; j++)//这两个for比较关键k*i+j,j,i代表的是指数 for(k = 0; k <= num && k*i+j <= 50; k++) b[k*i+j] += a[j]; for(j = 0; j <= 50; j++) { a[j] = b[j]; b[j] = 0; } } LL total = 0; for(int i = 1; i <= 50; i++) total += a[i]; printf("%lld\n",total); } return 0; }
整数的拆分的母函数代码
#include <bits/stdc++.h> using namespace std; typedef long long LL; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int N; while(scanf("%d",&N) != EOF ) { LL a[60], b[60];//存放的是系数 int i, j, k; for(i = 0; i <= N; i++) { a[i] = 1; b[i] = 0; } for(i = 2; i <= N; i++) { for(j = 0; j <= N; j++)//这两个for比较关键k*i+j,j,i代表的是指数 for(k = 0; k*i+j <= N; k++) b[k*i+j] += a[j]; for(j = 0; j <= N; j++) { a[j] = b[j]; b[j] = 0; } } printf("%lld\n",a[N]); } return 0; }