E - A very hard mathematic problem----(2015 summer training #3)

E - A very hard mathematic problem
时限:1000MS     内存:32768KB     64位IO格式:%I64d & %I64u

问题描述

  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. 
 

输入

  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 the total number of solutions in a line for each test case. 
 

样例输入

     
     
9 53 6 0
 

样例输出

     
     
1 1 0   

提示

 9 = 1^2 + 2^2 + 1 * 2 * 2 53 = 2^3 + 3^3 + 2 * 3 * 3 

分析:哎!老是TLE,这道题把我搞崩溃了。二分搜索,把z放在最外层可以计算出最大的x的值,优化计算。枚举x和z值,二分搜索y值。注意:当y值取最小值的时候大于k值,或者当y取最大值时小于k值时,直接跳过。我就是TLE这里,呜呜····。


CODE:

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;

int main()
{
    int k,maxn;
    while(scanf("%d",&k)&&k!=0){
        int ans=0;
        for(int z=2;z<31;z++){
            maxn=pow((double)k,1.0/z);
            for(int x=1;x<=maxn;x++){
                int l=x+1,r=maxn;
                if(pow(x,z)+pow(l,z)+x*l*z>k||pow(x,z)+pow(r,z)+x*r*z<k)
                    continue;
                while(l<=r){
                    int mid=(l+r)/2;
                    long long res=pow(x,z)+pow(mid,z)+x*mid*z;
                    if(res==k){
                        ans++;
                        break;
                    }
                    else if(res<k)
                        l=mid+1;
                    else
                        r=mid-1;
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值