• HDU 4430 Yukari's Birthday二分查找


     

    Description

    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
    代码:
    #include<cstdio>
    #include<iostream>
    #include<cmath>
    using namespace std ;
     long long ab(long long a,int b){
    
        long long res=1;
    
        for(int i=0;i<b;i++)
    
        res*=a;
    
        return res;
        }
    int main( )
    {
    	long long  n , m , k , mm ;
    	long long  r , rr , ll , e ;
    	long long ans ;
    	int i ;
    	while( scanf( "%lld" , &n ) != EOF )
    	{
    		r = 1 ;
    		k = n - 1 ;
    		// 因为k >= 2 所以半径不会很大
    		for(  i = 2 ; i <= 45  ; i++)
    		{
    			//二分查找k值
    			ll = 2 ;
    			rr = (long long) pow( n , 1.0 / i ) ;
    			//k最大是根号n
    			while( ll <= rr )
    			{
    				mm =  ( long long )( ll + rr ) / 2  ;
    				// 等比数列求和公式
    				ans = ( mm - ab( mm , i + 1 ) ) / ( 1 - mm ) ;
    
    				if( ans == n || n - 1 == ans )
    				{   
    				//cout << ans << endl ;
    					if( r * k > i * mm )
    					{
    						r = i ;
    						k = mm ;
    					}
    					break ;
    				}
    				else if( ans > n )
    				{
    					rr = mm - 1 ;
    				}
    				else ll = mm + 1 ;
    			}
    		}
    		cout << r << " " << k << endl ;
    	}
    }
    

      

  • 相关阅读:
    mysql limit
    random.nextint()
    “MSDTC 事务的导入失败: Result Code = 0x8004d00e。
    JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
    iOS ERROR: unable to get the receiver data from the DB 解决方式
    STL algorithm算法mov,move_backward(38)
    看 《一次谷歌面试趣事》 后感
    C++胜者树
    拿年终奖前跳槽,你才是赢家!
    日期字符串格式化成日期/日期格式化成指定格式字符串
  • 原文地址:https://www.cnblogs.com/20120125llcai/p/3072578.html
Copyright © 2020-2023  润新知