母函数的应用
HDU 1028
#include<stdio.h> #include<string> using namespace std; int n,c1[200],c2[200]; int main(){ int i,j,k; while(scanf("%d",&n)!=EOF){ memset(c2,0,sizeof(c2)); for(i=0;i<=n;i++) c1[i]=1; for(i=2;i<=n;i++){ for(j=0;j<=n;j++) for(k=0;k+j<=n;k+=i) c2[k+j]+=c1[j]; for(j=0;j<=n;j++){ c1[j]=c2[j]; c2[j]=0; } } printf("%d\n",c1[n]); } }
HDU 1398
#include<stdio.h> #include<string> using namespace std; int n,mod; int c1[500],c2[500]; int main(){ int i,j,k; memset(c2,0,sizeof(c2)); for(i=0;i<=300;i++) c1[i]=1; for(i=2;i<=17;i++){ for(j=0;j<=300;j++) for(k=0;k+j<=300;k+=i*i) c2[k+j]=(c2[k+j]+c1[j]); for(j=0;j<=300;j++){ c1[j]=c2[j]; c2[j]=0; } } while(scanf("%d",&n)!=EOF && n!=0){ printf("%d\n",c1[n]); } }
HDU 1085
#include<stdio.h> #include<string> using namespace std; int n; int c1[10000],c2[10000],a[5]; int main(){ int i,j,k,max; while(scanf("%d %d %d",&a[1],&a[2],&a[3])!=EOF && !(a[1]==0 && a[2]==0 && a[3]==0)){ memset(c2,0,sizeof(c2)); memset(c1,0,sizeof(c1)); for(i=0;i<=a[1];i++) c1[i]=1; for(i=2;i<=3;i++){ if(i==2) max=a[1]+a[2]*2; else max=a[1]+a[2]*2+a[3]*5; if(i==2){ for(j=0;j<=a[1];j++) for(k=0;k<=a[2]*2;k+=2) c2[k+j]+=c1[j]; for(j=0;j<=max;j++){ c1[j]=c2[j]; c2[j]=0; } } else{ for(j=0;j<=a[1]+a[2]*2;j++) for(k=0;k<=a[3]*5;k+=5) c2[k+j]+=c1[j]; for(j=0;j<=max;j++){ c1[j]=c2[j]; c2[j]=0; } } } for(i=1;;i++) if(c1[i]==0){ printf("%d\n",i); break; } } }