#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,a,b) for(int i=a;i<b;i++)
const int maxn=1e4+10;
ll dp[22][maxn];
/*
转移方程 有点像完全背包的感觉
dp[i][j]=dp[i-1][j]+dp[i][j-i*i*i];
也就是说能转移到当前状态的只有
1.不要 i*i*i
2. 要 i*i*i
另一个转移方程
是从(i,j)出发,看看能到哪些点
*/
int main(){
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1;i<22;i++){
for(int j=0;j<maxn;j++){
dp[i][j]=dp[i-1][j];
if(j>=i*i*i)dp[i][j]+=dp[i][j-i*i*i];
}
}
/*
for(int i=1;i<22;i++){
for(int j=0;j<maxn;j++){
for(int k=0;j+k*i*i*i<maxn;k++)
dp[i][j+k*i*i*i]+=dp[i-1][j];
}
}
*/
int n;
while(scanf("%d",&n)==1){
printf("%lld\n",dp[21][n]);
}
return 0;
}