E - A very hard mathematic problem
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
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
Hint
9 = 1^2 + 2^2 + 1 * 2 * 2 53 = 2^3 + 3^3 + 2 * 3 * 3
思路:
这题思路是听队友说的,我感觉自己好像患了一个毛病,就是看到暴力过不了就放弃这种方法,但是不会去想可不可以优化
一下。这个毛病必须改,不然很多暴力思路错过了,就走错解题方向了。其实如果肯自信一点,凡事别一下子否定了,肯定
收获巨大。改,改,改。
AC代码:
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; #define T 100005 typedef long long ll; #define CRL(a) memset(a,0,sizeof(a)) ll PoW(int a,int b) { ll k=1; while(b) { k*=a;b--; } return k; } bool find(int Y,int Z,int K) { int X,ln=1,rn=Y; ll sum; while(ln<rn){ X = (ln+rn)/2; sum = PoW(X,Z) + PoW(Y,Z) + X*Y*Z; if(sum == K) return true; if(sum > K) rn = X; else ln = X+1; } return false; } int main() { /*freopen("input.txt","r",stdin);*/ int n,i,j,k; while(scanf("%d",&n),n) { k=0; for(i=1;i<50000;++i) for(j=2;j<=32&&PoW(i,j)<n;++j) if(find(i,j,n))k++; printf("%d\n",k); } return 0; }