长春赛 K题

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4888

这个题就是求r*k其次r最小的满足(1 + k + k^2 +...+ k^r) = N (1 <= N <= 10^12)的数对。

枚举每个r<40,然后二分找k,控制好二分范围快速幂不会超。

PS:吐槽一下ZOJ,,昨天晚上狂WA到一点多,今天下午吃饭之前又WA了一个小时,以为是超范围了,但是一测没超,狂WA,,,,吃完饭看了一场电影,,WA得我就无力吐槽了,,最后我把%I64d 改成 %lld结果就AC了,,坑爹啊,,,还要吐槽一下ZOJ的status页面,刷新半天没结果。。。。快疯了。。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
struct Ans
{
    LL k,r;
}ans;
LL _pow(LL n,LL p)
{
    LL ret = 1;
    while(p)
    {
        if(p&1) ret *= n;
        n *= n;
        p >>= 1;
    }
    return ret;
}

Ans MIN(Ans a1,Ans a2)
{
    LL temp1 = a1.k*a1.r,temp2 = a2.k*a2.r;
    if(temp1 == temp2)
        return a1.r<a2.r ? a1 : a2;
    return temp1 < temp2 ? a1:a2;
}
LL cal(LL k,LL r)
{
    LL temp = _pow(k,r+1);
    return (temp-1)/(k-1);
}
void find(LL r,LL n)
{
    if(r == 1)
    {
        Ans A;
        A.r = 1;A.k = n-1;
        ans = MIN(ans,A);
        return;
    }
    LL left = 2,right = (LL)pow((double)n,1.0/r);
    while(left <= right)
    {
        LL mid = (left + right)>>1;
        LL temp = cal(mid,r);
        //cout <<"mid: "<< mid  << " r: "<<r << ' ' <<temp << endl;
        if(temp < n)left = mid+1;
        else if(temp > n)right = mid-1;
        else
        {
            Ans A;
            A.k = mid;A.r = r;
            ans = MIN(ans,A);
            return;
        }
    }
    return ;
}
int main()
{
    //freopen("input.txt","r",stdin);
    LL n;
    while(~scanf("%lld",&n))
    {
        LL temp = 10000000;
        ans.k = temp*temp;ans.r = 50;
        for(LL r=39;r>=1;r--)
        {
            find(r,n);find(r,n+1);
        }
        printf("%lld %lld\n",ans.r,ans.k);
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值