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.
For each case, there is only one integer K (0 < K < 2^31) in a line.
K = 0 implies the end of input.
9 53 6 0
1
1
0
9 = 1^2 + 2^2 + 1 * 2 * 2 53 = 2^3 + 3^3 + 2 * 3 * 3
分析:
如果用三重循环依次枚举的话必定超时。所以我们考虑只枚举x和z,然后再二分找符合的y值。
先打表,可以缩短时间。
注意double类型二分函数的写法与int类型二分函数的写法又和不同。
#include<iostream>
#include<cstdio>
#include<string.h>
#include<math.h>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<queue>
#include<iomanip>
using namespace std;
const int INF = 0x3f3f3f3f;
const int NINF = 0xc0c0c0c0;
int num[50000][35] = {0};
int n;
bool jud(int x,int z,int miu)
{
int l = x+1, r= 45000;
while(l<=r){
int mid = (l+r)>> 1;
if(num[mid][z] <= 0){
r = mid-1;
continue;
}
if(pow(mid,z)+x*mid*z > miu){
r = mid-1; //here wa 以 2和4 为例 !! 切记!
}
else if(pow(mid,z)+x*mid*z < miu) {
l = mid+1; // wa
}
else return true;
}
return false;
}
int main()
{
for(int x=1;x<45000;x++){
num[x][1] = x;
for(int z=2;z<31;z++){
num[x][z] = num[x][z-1]* x;
if(num[x][z] >= 2e9){
break;
}
}
}
while(scanf("%d",&n) != EOF){
if( n== 0 ) break;
int cnt = 0;
for(int x=1;x<45000&&x<n;x++){
for(int z=2;z<31;z++){
if(num[x][z] <= 0 ) break;
int miu = n - num[x][z];
if(miu <= 0) break;
if(jud(x,z,miu)){
cnt++;
}
}
}
printf("%d\n",cnt);
}
}