HDU 4430

HDU 4430

Description

Today isYukari's n-th birthday. Ran and Chen hold a celebration party for her. Nowcomes the most important part, birthday cake! But it's a big challenge for themto place n candles on the top of the cake. As Yukari has lived for such a longlong time, though she herself insists that she is a 17-year-old girl. 
To make the birthday cake look more beautiful, Ran and Chen decide to placethem like r ≥ 1 concentric circles. They place k i candlesequidistantly on the i-th circle, where k ≥ 2, 1 ≤ i ≤ r. And it's optional toplace at most one candle at the center of the cake. In case that there are alot of different pairs of r and k satisfying these restrictions, they want tominimize r × k. If there is still a tie, minimize r. 

Input

There are about10,000 test cases. Process to the end of file. 
Each test consists of only an integer 18 ≤ n ≤ 10 12

Output

For each testcase, output r and k.

Sample Input

18

111

1111

Sample Output

1 17

2 10

3 10

 

一.题意分析

蛋糕从内到外是一组同心圆,有r层,最中间放一个蜡烛,然后往外每一层放ki个蜡烛。要求r*k最小,并且输出最小时的r。

二.思路过程

先估算出r的大小范围,大概在40左右。然后对r的范围进行二分,最后枚举出结果。

三.代码

<span style="font-family:Courier New;font-size:18px;">#include <iostream>
#include <cstdio>
using namespace std;
#define ll long long
 
ll n;
 
ll erfen(ll t)
{
    ll i;
    ll left = 2, right = n, mid;
    while(left <= right)
    {
        ll sum = 1, ans = 0;
        mid = (left + right) / 2;
        for(i=1; i<=t; i++)
        {
            if(n/sum<mid)
            {
                ans = n + 1;
                break;
            }
 
            sum*=mid;
            ans+=sum;
            if(ans>n)
                break;
        }
 
        if(ans == n || ans == n-1)
            return mid;
        else if(ans < n-1)
            left = mid + 1;
        else
            right = mid -1;
    }
    return -1;
}
 
int main()
{
    ll i, left, right, mid, tmp;
    while(scanf("%lld", &n)!=EOF)
    {
        left = 1, right = n - 1;
        for(i=2; i<45; i++)
        {
            tmp = erfen(i);
            if(tmp!=-1 && i * tmp < left * right)
            {
                left = i, right = tmp;
            }
        }
        printf("%lld %lld\n", left, right);
    }
    return 0;
}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值