zoj3665解题报告

这道题是长春赛区的K题;

题意:(K^r)+(K^(r-1))+....+K+1=N,或:(K^r)+(K^(r-1))+....+K=N;给出N,求K和R的值,如果有多个答案,输出R*K最小的那个;k>=2;N<=10^12;

题解:R一定是小于40的(K大于等于2),枚举R的值,R的值一定的情况下,N相对于K是单调递增的,故用二分求答案

#include <iostream>
#include <cstring>
#include <cstdio>
#include <fstream>
using namespace std ;

long long n , r , k ;

long long find( long long left , long long right , long long num )
{
    int  i , j ;
    long long mid ;
    long long sum ;
    long long tmp ;

    while( left <= right )
    {
        int flag = 0 ;
        mid = ( left + right ) / 2 ;
        sum = 0 ; tmp = 1 ;
        for( i = 1 ; i <= num ; i ++ )
        {
            if( sum > n / mid  )
            {
                right = mid - 1 ;
                flag = 1 ;
                break ;
            }
            tmp *= mid ;
            sum += tmp ;
        }
        if( flag ) continue ;
        if( sum == n ) return mid ;
        if( sum > n  ) right = mid - 1 ;
        if( sum < n  ) left  = mid + 1 ;
    }
    return 0 ;
}

int  main()
{
    int  i , j ;
    while( scanf( "%lld" , & n ) != EOF )
    {
        k = n - 1 ;
        r = 1 ;
        for( i = 2 ; i <= 40 ; i ++ )
        {
            long long t = find( 2 , n , i ) ;
            if( t == 0 ) continue ;
            if( i * t < r * k || ( i * t == r * k && i < r ) )
            {
                r = i ;
                k = t ;
            }
        }

        n -- ;
        for( i = 2 ; i <= 40 ; i ++ )
        {
            long long t = find( 2 , n , i ) ;
            if( t == 0 ) continue ;
            if( i * t < r * k || ( i * t == r * k && i < r ) )
            {
                r = i ;
                k = t ;
            }
        }

        printf( "%lld %lld\n" , r , k ) ;
    }
    return 0 ;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值