A very hard mathematic problem HDU - 4282
Haoren is very good at solving mathematic problems. Today he is working a problem like this:
Find three positive integers X, Y and Z (X < Y, Z > 1) that holds
X^Z + Y^Z + XYZ = K
where K is another given integer.
Here the operator “^” means power, e.g., 2^3 = 2 * 2 * 2.
Finding a solution is quite easy to Haoren. Now he wants to challenge more: What’s the total number of different solutions?
Surprisingly, he is unable to solve this one. It seems that it’s really a very hard mathematic problem.
Now, it’s your turn.
Input
There are multiple test cases.
For each case, there is only one integer K (0 < K < 2^31) in a line.
K = 0 implies the end of input.
Output
Output the total number of solutions in a line for each test case.
Sample Input
9
53
6
0
Sample Output
1
1
0
Hint
9 = 1^2 + 2^2 + 1 * 2 * 2
53 = 2^3 + 3^3 + 2 * 3 * 3
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
long long int pow_mod(long long int a,int b){
long long int s=1,base=a;
while(b){
if (b&1)
s*=base;
b>>=1;
base*=base;
}
return s;
}
using namespace std;
int main(){
long long int k;
long long int sum;
while(~scanf("%lld",&k)&&k){
sum=0;
long long int qq=sqrt(k);
if (qq*qq==k){
sum+=(qq-1)/2;
}
for(int z=3;z<31;z++){
for (int x=1;x<=65536;x++){
long long int ss=pow_mod(x,z);
if (ss*2>=k){
break;
}
for (int y=x+1;y<=65536;y++){
long long int sss=pow_mod(y,z);
if (ss+sss+x*y*z==k){
sum++;
}
else if (ss+sss+x*y*z<k){
continue;
}
else{
break;
}
}
}
}
printf("%lld\n",sum);
}
return 0;
}