和hdu 1028差不多,入门的模板题。
#include <cstdio>
const int MAXN = 310;
int C1[MAXN];
int C2[MAXN];
int main()
{
int num;
while(scanf("%d",&num) && num)
{
for(int i = 0; i <= num; ++i)
{
C1[i] = 1;
C2[i] = 0;
}
for(int i = 2; i*i <= num; ++i)
{
for(int j = 0; j <= num; ++j)
{
for(int k = 0; k+j <= num; k += i*i)
C2[k+j] += C1[j];
}
for(int j = 0; j <= num; ++j)
{
C1[j] = C2[j];
C2[j] = 0;
}
}
printf("%d\n",C1[num]);
}
return 0;
}