A very hard mathematic problem

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
</pre>#include <stdio.h><br />#include <math.h><br />#include<algorithm><br />#include<iostream><br />using namespace std;<br />long long pow(long long x, int z)<br />{<br />    long long temp = x;<br />    for(int i=2;i<=z;i++)<br />        x*=temp;<br />    return x;<br />}<br />int main()<br />{<br />    int n;<br />    while(scanf("%d",&n)&&n)<br />    {<br /><span style="white-space:pre">		</span>int ans=0;<br /><span style="white-space:pre">		</span>int temp;<br /><span style="white-space:pre">		</span>temp=(int)sqrt(n);<br />        if(temp*temp==n)<br />            ans+=(temp-1)/2;<br />        for(int z=3;z<31;z++)<br />        {<br />            for(long long x=1;;x++)<br />            {<br />                long long u=pow(x, z);<br />                if(u>=n/2)<br />                    break;<br />                for(long long y=x+1; ;y++)<br />                {<br />                    long long v=pow(y,z);<br />                    if(u+v+z*x*y>n)<br />                        break;<br />                    else if(u+v+z*x*y==n)<br />                    {<br />                        ans++;<br />                        break;<br />                    }<br />                }<br />            }<br />        }<br />        printf("%d\n",ans);<br />    }<br />    return 0;<br />}<br /></div></div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值