这题就是利用暴力求解,为了防止超时,技巧有从z开始枚举,把需要枚举的次数较多的z=2的情况单独列出来,利用sqrt求解。还有要注意的是虽然题目中说k<2^31,但实际上我们求解时是会用到超出32位的情况的,如果还用int,就不行了,所以记得用__int64.
#include <stdio.h>
#include<math.h>
__int64 pow(__int64 a,__int64 n)
{
__int64 ret=1;
__int64 temp=a;
while(n)
{
if(n&1)ret*=temp;
temp*=temp;
n>>=1;
}
return ret;
}
int main()
{
__int64 k;
while(~scanf("%I64d",&k)&&k)
{
__int64 x=1,y=2,z=2;
__int64 ans=0;
__int64 u,v;
x=sqrt(k);
if(x*x==k) ans+=(x-1)/2;
for(z=3;z<31;z++)
{
for(x=1;;x++)
{
u=pow(x,z);
if(u*2>=k)break;
for( y=x+1;;y++)
{
v=pow(y,z);
if(u+v+x*y*z>k)break;
if(u+v+x*y*z==k)
{
ans++;
break;
}
}
}
}
printf("%I64d\n",ans);
}
return 0;
}