/* x^z+y^z+x*y*z=k,x<y , z>1 , max(k)=2^31,k已知!求x y z的組合,k的範圍很明:1<k<32 ,顯然當z取2的時候,是個完全平方式!那麼如果考慮 (x+y)^z=k,那麼(x+y)最大可以取到 1309左右,那麼在1<k<32,0<x+y<1305,x<y;這個區間裏面窮舉就可以了!點擊打開鏈接
#include < iostream >
#include < cstdio >
#include < math.h >
#define N 1309
typedef __int64 LL;
using namespace std;
LL POW(int x,int y)
{
LL s=1;
for(int i=1;i<=y;i++) s*=x;
return s;
}
int main ()
{
//freopen("t.txt","r",stdin);
LL x,y,z,k,s,t,r,w;
while(scanf("%I64d",&k),k)
{
s = 0; z = 2;
t = r = w =0;
t = ( LL )sqrt(k*1.0);
if(t * t == k) s= (t-1)/2;
while(z++<32)
{
for(t=0, x=1 ; x<N ; x++)
{
t = POW(x,z);
if(t >= k/2) break;
for(y=x+1 ; y<N ; y++)
{
r=POW(y,z);
w=t + r + x*y*z;
if(w>=k){
if(w==k) s+=1;
break;
}
}
}
}
printf("%I64d\n",s);
}
return 0;
}
PS:c++內部的pow()函數很不靠譜,運行效率低就算了,還對參數傳遞十分嚴格,以後不管什麼情況,一定要自己寫pow函數!