A very hard mathematic problem

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. 
 

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 
 
   
思路:
  这题思路是听队友说的,我感觉自己好像患了一个毛病,就是看到暴力过不了就放弃这种方法,但是不会去想可不可以优化
一下。这个毛病必须改,不然很多暴力思路错过了,就走错解题方向了。其实如果肯自信一点,凡事别一下子否定了,肯定
收获巨大。改,改,改。
 
   
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;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值