ProblemA(HDU1398)
给你一个数 让你求出1~17中每个数的平方任意组合 有几种情况满足条件。套母函数就行,注意是数的平方,k要写成i*i。
#include<stdio.h>
#include<math.h>
#define max 302
int num1[300];
int num2[300];
void init()
{
for(int i=0; i<max; i++)
{
num1[i]=1;
num2[i]=0;
}
for(int i=2; i<=17; i++)
{
for(int j=0; j<max; j++)
for(int k=0; k+j<max; k+=i*i)//注意:这里是平方。
{
num2[k+j]+=num1[j];
}
for(int i=0; i<max; i++)
{
num1[i]=num2[i];
num2[i]=0;
}
}
}
int main()
{
int n;
init();
while(scanf("%d",&n),n)
{
printf("%d\n",num1[n]);
}
return 0;
}
ProblemB(HDU1028)
和上一题类似,是一个标准的母函数。
#include<iostream>
using namespace std;
#define N 121
int main()
{
unsigned long a[N],b[N];
int i,j,k;
int n;
while(cin>>n)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
a[0]=1;
for(i=1;i<=n;i++)
{
for(j=0;j<=n;j++)
{
for(k=0;k*i+j<=n;k++)
b[k*i+j]+=a[j];
}
for(k=0;k<=n;k++)
{
a[k]=b[k];
b[k]=0;
}
}
cout<<a[n]<<endl;
}
return 0;
}
ProblemC(HDU2082)
这题很经典哒,是我做过的第一道母函数题,还加了点小备注2333。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=50;
int c1[N+10],c2[N+10],num[30];
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(c1,0,sizeof(c1)); //c1[ ]保存当前得到的多项式各项系数
memset(c2,0,sizeof(c2)); //c2[ ]保存每次计算时的临时结果
for(int i=1;i<=26;i++)
scanf("%d",&num[i]);
c1[0]=1; //相当于用X^0去乘以后面的多项式
for(int i=1;i<=26;i++){ //要乘以26个多项式
for(int j=0;j<=N;j++) //c1的各项的指数
for(int k=0;k<=num[i] && j+k*i<=N;k++) //k*i表示被乘多项式各项的指数,(X^0*i + X^1*i + X^2*i + ……)
c2[j+k*i]+=c1[j]; //指数相加得j+k*i,加多少只取决于c1[j]的系数,因为被乘多项式的各项系数均为1
for(int j=0;j<=N;j++){
c1[j]=c2[j];
c2[j]=0;
}
}
int ans=0;
for(int i=1;i<=N;i++)
ans+=c1[i];
printf("%d\n",ans);
}
return 0;
}