#include <stdio.h>
#include <string.h>

int main(void)
{
	int coin[301], coin_next[301];
	int i, j, k;
	int paid;
	int a;
	
//	for (i = 1; i <= 300; i++){
//		coin[i] = 1;
//	}
	memset(coin, 0, sizeof(coin));
	coin[0] = 1;

	for (i = 1; i <= 17; i++){					// 種別
//		memcpy(coin_next, coin, sizeof(coin));
		memset(coin_next, 0, sizeof(coin_next));
		for (j = 0; j <= 300 / (i * i); j++){	// 枚数
			for (k = 0; k <= 300; k++){
				if (coin[k] != 0){
					if (k + (i * i) * j <= 300){
	//					coin_next[k + (i * i) * j] += coin[k] + coin[k + (i * i) * j];
						coin_next[k + (i * i) * j] += coin[k];
					}
				}
			}
		}
		memcpy(coin, coin_next, sizeof(coin));

//printf("<%d>", i * i);
		
//for (a = 1; a <= 30; a++){
//	printf("%d ", coin[a]);
//}
//printf("\n");
	}

	while (1){
		scanf("%d", &paid);
		if (paid == 0){
			break;
		}

		printf("%d\n", coin[paid]);
	}
	return (0);
}