E - A very hard mathematic problem
时限:1000MS 内存:32768KB 64位IO格式:%I64d & %I64u
问题描述
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.
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.
输入
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.
For each case, there is only one integer K (0 < K < 2^31) in a line.
K = 0 implies the end of input.
输出
Output the total number of solutions in a line for each test case.
样例输入
9 53 6 0
样例输出
1 1 0
提示
9 = 1^2 + 2^2 + 1 * 2 * 2 53 = 2^3 + 3^3 + 2 * 3 * 3
分析:哎!老是TLE,这道题把我搞崩溃了。二分搜索,把z放在最外层可以计算出最大的x的值,优化计算。枚举x和z值,二分搜索y值。注意:当y值取最小值的时候大于k值,或者当y取最大值时小于k值时,直接跳过。我就是TLE这里,呜呜····。
CODE:
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
int main()
{
int k,maxn;
while(scanf("%d",&k)&&k!=0){
int ans=0;
for(int z=2;z<31;z++){
maxn=pow((double)k,1.0/z);
for(int x=1;x<=maxn;x++){
int l=x+1,r=maxn;
if(pow(x,z)+pow(l,z)+x*l*z>k||pow(x,z)+pow(r,z)+x*r*z<k)
continue;
while(l<=r){
int mid=(l+r)/2;
long long res=pow(x,z)+pow(mid,z)+x*mid*z;
if(res==k){
ans++;
break;
}
else if(res<k)
l=mid+1;
else
r=mid-1;
}
}
}
printf("%d\n",ans);
}
return 0;
}