Problem Description
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.
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.
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思路:枚举x和次数z,然后二分查找是否有符合条件的y出现y*y<2^31.z增加值将是指数上涨所以时间复杂度为,log(k)*log(k)*sqrt(k)#include <cstdio> #include <algorithm> #include <set> #include <string> #include <cstring> #include <cmath> using namespace std; typedef long long ll; ll cal(ll x,ll z,ll k) { ll sum,l=1,r=x-1; while(l<=r) { ll y=(l+r)/2,yz=1; for(int i=1; i<=z; i++) yz*=y; sum=yz+x*y*z; if(sum>k) r=y-1; else if(sum<k) l=y+1; else return 1; } return 0; } int main() { int n; while(scanf("%d",&n)==1&&n!=0) { ll ans=0,x=2,y=2,z=2; for(ll x=2; x*x<=n; x++) //先枚举x,z再二分y, { for(ll z=2; ; z++) { ll xz=1; for(int i=1; i<=z; i++) //得到x^z xz*=x; if(xz>n) break; else if(cal(x,z,n-xz)) ans++; } } printf("%lld\n",ans); } }