//思路就是大整数数组保存fib数,然后二分查找 import java.util.*; import java.math.*; import java.io.*; class Main { public static void main(String[] args) { // TODO Auto-generated method stub BigInteger[] f = new BigInteger[500]; f[0]=f[1]=BigInteger.ONE; for(int i=2;i<500;i++) f[i]=f[i-1].add(f[i-2]); f[0]=BigInteger.ZERO; Scanner sc = new Scanner(new BufferedInputStream(System.in)); BigInteger l,r; while(sc.hasNext()) { l = sc.nextBigInteger(); r = sc.nextBigInteger(); if(l.compareTo(BigInteger.ZERO)==0&&r.compareTo(BigInteger.ZERO)==0) break; int ansl = Arrays.binarySearch(f,l ); int ansr = Arrays.binarySearch(f, r); if(ansl<0) ansl=-ansl-2; if(ansr<0) ansr=-ansr-2; if(Arrays.binarySearch(f, l)>0) ansl--; System.out.println(ansr-ansl); } } }
Iron vegetable けいぐ
附Arrays.binarySearch()的用法:
public static int binarySearch(Object[] a,Object key) 使用二分搜索法来搜索指定数组,以获得指定对象。在进行此调用之前,必须根据元素的自然顺序对数组进行升序排序(通过 sort(Object[]) 方法)。如果没有对数组进行排序,则结果是不确定的。(如果数组包含不可相互比较的元素(例如,字符串和整数),则无法 根据其元素的自然顺序对数组进行排序,因此结果是不确定的。)如果数组包含多个等于指定对象的元素,则无法保证找到的是哪一个。
参数:a - 要搜索的数组key - 要搜索的值
返回:如果它包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。 插入点 被定义为将键插入数组的那一点:即第一个大于此键的
元素索引,如果数组中的所有元素都小于指定的键,则为 a.length。注意,这保证了当且仅当此键被找到时,返回的值将 >= 0。
否则返回 (-(插入点) - 1)这句话要注意:要是查询的的值小于数组里面
的最小值那么结果(-(0)-1结果就是-1),如果查询的 值大于数组里面的最大值。那么结果就是(-(它的索引值)-1结果就是-(1+索引值))
时间: 2024-10-17 16:29:36