hdu 4282 A very hard mathematic problem

来源:互联网 发布:qq飞车霹雳火数据 编辑:程序博客网 时间:2024/05/16 05:53

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4282


题意给你 X^Z + Y^Z + XYZ = KX<Y, Z>1),给你整数K(0< K <2^32)的值,问你使此表达式成立的可能有多少种?


想法是枚举XZ,通过二分求Y,存在则ans++,不存在则跳过。

当时写的时候二分求Y时,设置初始范围太大,到时计算过程爆longlong导致错误:

枚举Z231枚举

X1sqrtK)(还能再小)

Y1powK1/z)间二分求得


#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>long long pow1(long long x,long long y){    long long n=1;    for(int i=0;i<y;i++){        n*=x;    }    return n;}long long sk(long long x,long long y,long long z){    return pow1(x,z)+pow1(y,z)+x*y*z;}int main(void){    int ans;    long long x,y,z,k;    while(scanf("%I64d",&k)&&k!=0){        ans=0;        for(z=2;z<=31;z++){            for(x=1;x<sqrt(k);x++){                if(sk(x,x+1,z)>k) break;                long long l=x+1,r=(long long)pow((double)k,1.0/z)+1,m;                                while(l<r){                    m=(l+r)/2;                    //if(z==30) printf("l:%I64d m:%I64d r:%I64d\n",l,m,r);                    if(sk(x,m,z)==k){                        //printf("x=%d,y=%d,z=%d\n",x,m,z);                        ans++;                        break;                    }                    else if(sk(x,m,z)>k){                        r=m;                    }                    else if(sk(x,m,z)<k){                        l=m+1;                    }                                                       }            }                }        printf("%d\n",ans);    }    return 0;}


原创粉丝点击