手动开高次方

来源:互联网 发布:ubuntu怎么安装jdk1.8 编辑:程序博客网 时间:2024/05/16 09:02

也就开到59次根号下。当然精度要比pow(n,1/m)高。
find(x,k)表示xk

const LL INF = 1e18+300;const LL T = (1LL<<31);LL pow_mul(LL x,LL k){    LL ans=1;    while(k)    {        if(k&1)        {            double judge=1.0*INF/ans;            if(x>judge)return -1;            ans*=x;        }        k>>=1;        if(x>T&&k>0)return -1;        x*=x;    }    return ans;}LL find(LL x,LL k){    LL r=(LL)pow(x,1.0/k);    LL p=pow_mul(r,k);    if(p==x)return r;    if(p>x||p==-1)r--;    else    {        LL tmp=pow_mul(r+1,k);        if(tmp!=-1&&tmp<=x)r++;    }    return r;}