表示看这篇博客后找到了思路:
http://blog.csdn.net/queuelovestack/article/details/47291195
补充一下数据,方便观察规律
m LBorderm m-LBorder fibn
1 0 1 1
2 0 2 1
3 1 2 2
4 1 3 3
5 2 3 5
6 3 3 8
7 2 5 13
8 3 5 21
9 4 5 34
10 5 5 55
11 6 5 89
12 4 8 144
13 5 8 233
14 6 8 377
仔细观察一下,便会得出这样一个结论:
当我们找到第一个i满足m+1<|fibi|时,LBorderm=m-|fibi-2|(|fibi-2|表示斐波那契串fibi-2的长度)
附上代码:
1 import java.util.*; 2 import java.math.*; 3 public class Main { 4 5 public static void main(String[] args) { 6 7 BigInteger ar[]=new BigInteger[1000]; 8 ar[1]=BigInteger.valueOf(1); 9 ar[2]=BigInteger.valueOf(2); 10 for(int i=3;i<1000;++i){ 11 ar[i]=ar[i-1].add(ar[i-2]); 12 } 13 Scanner cin=new Scanner(System.in); 14 int t=cin.nextInt(); 15 while(t-- >0){ 16 int n=cin.nextInt(); 17 BigInteger m=cin.nextBigInteger(); 18 for(int i=1;i<1000;++i){ 19 if(m.compareTo(ar[i]) <0 && m.compareTo(ar[i-1]) >=0){ 20 m=m.subtract(ar[i-2]).mod(BigInteger.valueOf(258280327)); ; 21 break; 22 } 23 } 24 System.out.println(m); 25 } 26 } 27 } 28