cheng_you_know

学而时习之!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

A very hard mathematic problem

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2697    Accepted Submission(s): 782

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.

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 <iostream>
#include <math.h>
using namespace std;
int main()
{
    int x,y,z,k;
    while(scanf("%d",&k),k)
    {
        int  count = 0;
        for(z=2;z<31;z++)
        {
            y= (int)pow((double)k,(double)1.0/z);
            for(x=1;x<y;)
            {   //需要64位,防止溢出
                __int64 temp = pow((double)x,(double)z) + pow((double)y,(double)z) + x*y*z;
                if(temp < k) //too smalll
                    x++;
                else if(temp > k) //too large
                    y--;
                else
                {
                    count++;
                    x++; //则x向前加
                    y--;//y向后减,尝试还有木有符合要求的组合
                }
            }
        }
        printf("%d\n",count);
    }
    return 0;
}
posted on 2013-06-01 20:40  cheng_you_know  阅读(185)  评论(0编辑  收藏  举报