zoukankan      html  css  js  c++  java
  • 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 ;
    	}
    }
    

      

  • 相关阅读:
    CENTOS7下安装REDIS
    金融量化之tushare模块的使用
    fiddler抓包出现错误 creation of the root certificate was not successful
    matplotlib学习
    Android-消息处理学习总结(Handler,Looper)
    Android-View的绘制源码学习总结
    数据库练习
    编译原理实验一
    图形学
    资源分配(分组背包)
  • 原文地址:https://www.cnblogs.com/20120125llcai/p/3072578.html
Copyright © 2011-2022 走看看