//二分x或y,其他的直接暴力枚举就可以了
#include<stdio.h>
#include<string.h>
#include<math.h>
__int64 p[51000][32];
int main()
{
int sum;
__int64 x,y,z,k,s,e,mid;
__int64 xx,kk,k1,k2;
memset(p,0,sizeof(p));
kk=1;
kk<<=32;
for(x=1;x<=50000;x++)
{
p[x][0]=1;
for(y=1;y<32;y++)
{
if(p[x][y-1]<0)
{
p[x][y]=-1;
continue;
}
p[x][y]=p[x][y-1]*x;
if(p[x][y]>kk)
p[x][y]=-1;
}
}
while(scanf("%I64d",&k),k)
{
sum=0;
k1=(__int64)sqrt((double)k);
for(z=2;z<=31;z++)
{
for(x=1;x<=k1;x++)
{
if(p[x][z]==-1||p[x][z]>k)
break;
xx=p[x][z];
k2=k-xx;
kk=x*z;
s=x+1,e=k1+1;
while(s<=e)
{
mid=(s+e)>>1;
if(p[mid][z]==-1||p[mid][z]>k2||mid*kk>k2||p[mid][z]+mid*kk>k2)
e=mid-1;
else if(p[mid][z]+mid*kk==k2)
{
sum++;
break;
}
else s=mid+1;
}
}
}
printf("%d\n",sum);
}
return 0;
}