zoukankan      html  css  js  c++  java
  • HDU 4430 Yukari's Birthday

    Yukari's Birthday

    Time Limit: 6000ms
    Memory Limit: 32768KB
    This problem will be judged on HDU. Original ID: 4430
    64-bit integer IO format: %I64d      Java class name: Main
     
    Today is Yukari's n-th birthday. Ran and Chen hold a celebration party for her. Now comes the most important part, birthday cake! But it's a big challenge for them to place n candles on the top of the cake. As Yukari has lived for such a long long 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 place them like r ≥ 1 concentric circles. They place ki candles equidistantly on the i-th circle, where k ≥ 2, 1 ≤ i ≤ r. And it's optional to place at most one candle at the center of the cake. In case that there are a lot of different pairs of r and k satisfying these restrictions, they want to minimize r × k. If there is still a tie, minimize r.
     

    Input

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

    Output

    For each test case, output r and k.
     

    Sample Input

    18
    111
    1111

    Sample Output

    1 17
    2 10
    3 10

    Source

     
    解题:二分。根据等比数列,可知x(1-xn) = k*(1-x)
     
    n的范围比较小,枚举n再二分x即可。
     
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <algorithm>
     6 #include <climits>
     7 #include <vector>
     8 #include <queue>
     9 #include <cstdlib>
    10 #include <string>
    11 #include <set>
    12 #include <stack>
    13 #define LL long long
    14 #define pii pair<int,int>
    15 #define INF 0x3f3f3f3f
    16 using namespace std;
    17 LL mypow(LL x,LL y){
    18     LL ans = 1;
    19     while(y){
    20         if(y&1) ans *= x;
    21         y >>= 1;
    22         x *= x;
    23     }
    24     return ans;
    25 }
    26 int main() {
    27     LL n,r,k,lt,rt,mid;
    28     while(~scanf("%I64d",&n)){
    29         r = 1;
    30         k = n-1;
    31         for(int i = 2; i <= 41; i++){
    32             lt = 2;
    33             rt = (LL)pow(n,1.0/i);
    34             while(lt <= rt){
    35                 mid = (lt+rt)>>1;
    36                 LL sum = (mid-mypow(mid,i+1))/(1-mid);
    37                 if(sum == n||sum == n-1){
    38                     if(i*mid < r*k){
    39                         r = i;
    40                         k = mid;
    41                     }
    42                     break;
    43                 }else if(sum < n) lt = mid+1;
    44                 else rt = mid-1;
    45             }
    46         }
    47         printf("%I64d %I64d
    ",r,k);
    48     }
    49     return 0;
    50 }
    View Code
  • 相关阅读:
    Linux下配置APUE的编译 报错之后如何处理
    Sed命令的使用详细解释
    Linux下安装xrdp
    CentOS7.1 VNC Server服务配置
    Linux下core文件调试方法
    GDB获取帮助信息
    gdb调试工具学习
    Linux中tftp安装及使用笔记
    CentOS7.3安装Python3.6
    C#语言注释详解
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/3959712.html
Copyright © 2011-2022 走看看