因为y的限制条件比较多,所以循环x,z找y,用二分的思路,几乎是暴力过的
#include <math.h>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
__int64 powx(int x,int y)
{
int i;
__int64 ans=1;
for (i=0;i<y;i++)
ans*=x;
return ans;
}
bool erfen(int l,int r,int z,int x,__int64 ans)
{
r=min((__int64)pow(1.0*ans,1.0/z),(__int64)r);
int i,mid=(l+r)/2;
__int64 cnt=x*mid*z+powx(mid,z);
//printf("1\n");
if (l>r) return 0;
else if (cnt==ans)
return 1;
//else if (l>=r) return 0;
else if(cnt>ans)
return erfen(l,mid-1,z,x,ans);
else
return erfen(mid+1,r,z,x,ans);
return 0;
}
int main()
{
__int64 k;
int cnt,x,y,z,i,j;
while (scanf("%I64d",&k)!=EOF&&k)
{
cnt=0;
for (i=2;i<31;i++)
for (j=1;j<65536;j++)
{
if (powx(j,i)>=k) break;
//printf("1\n");
if (erfen(j+1,65536,i,j,k-powx(j,i))) cnt++;
}
printf("%d\n",cnt);
}
}