POJ2413二分

注意二分, 上界。

import java.beans.beancontext.BeanContext;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
import java.util.Stack;
import java.util.StringTokenizer;


public class Main{

        public static void main(String[] args) throws IOException{

                InputReader in = new InputReader(System.in) ;
                StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
                PrintWriter out = new PrintWriter(System.out);

                BigInteger f  ;
                BigInteger f1 = BigInteger.valueOf(1) ;
                BigInteger f2 = BigInteger.valueOf(2) ;
                BigInteger up = BigInteger.valueOf(10).pow(100) ;
                ArrayList<BigInteger> fibo = new ArrayList<BigInteger>() ;
                fibo.add(f1) ; 
                fibo.add(f2) ;
                for( ; (f = f1.add(f2) ).compareTo(up) <= 0 ; ){
                        fibo.add(f) ;
                        f1 = f2 ;
                        f2 = f  ;
                }
                fibo.add(f1.add(f2)) ;


                for(;;){
                      int t = 0 ;
                      f1 = new BigInteger(in.next()) ;
                      f2 = new BigInteger(in.next()) ;
                      if(f1.compareTo(BigInteger.ZERO) == 0 && f2.compareTo(BigInteger.ZERO) == 0) break ;

                      int l = 0 , r = fibo.size() - 1 , mid , lid = 0 , rid = 0 ;
                      while(l <= r){
                            mid = (l + r) >> 1 ;
                            if(fibo.get(mid).compareTo(f1) >= 0){
                                    lid = mid ;
                                    r = mid - 1 ;
                            }
                            else l = mid + 1 ;
                      }


                      l = 0 ; r = fibo.size() - 1  ;
                      while(l <= r){
                            mid = (l + r) >> 1 ;
                            if(fibo.get(mid).compareTo(f2) <= 0){
                                    rid = mid ;
                                    l = mid + 1 ;
                            }
                            else r = mid - 1 ;
                      }

                      out.println(rid - lid + 1) ; //out.flush() ;
                }    
                out.flush() ;
        }
}

class InputReader {
    public BufferedReader reader;
    public StringTokenizer tokenizer;

    public InputReader(InputStream stream) {
        reader = new BufferedReader(new InputStreamReader(stream), 32768);
        tokenizer = null;
    }

    public String next(){
        while(tokenizer == null || !tokenizer.hasMoreTokens()){
            try{
                tokenizer = new StringTokenizer(reader.readLine());
            }catch(IOException e){
                throw new RuntimeException(e);
            }
        }
        return tokenizer.nextToken();
    }

    public int nextInt() {
        return Integer.parseInt(next());
    }

    public double nextDouble() {
        return Double.parseDouble(next());
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值