解析:找到最大的i是|fib_i| <= m,结果为m-|fib_i-1|。
[code]:
import java.util.*;
import java.math.*;
import java.io.*;
public class Main{
static BigInteger m,f[] = new BigInteger[1001],mod = BigInteger.valueOf(258280327);
static int n;
static void preprocess(){
f[1] = BigInteger.ONE;
f[2] = BigInteger.ONE;
for(int i = 3;i <= 1000;i++) f[i] = f[i-1].add(f[i-2]);
}
static int bin(BigInteger x){
int lb,rb,mid;
lb = 0;rb = 1001;
while(rb - lb>1){
mid = (lb+rb)>>1;
if(f[mid].compareTo(x)<=0) lb = mid;
else rb = mid;
}
return lb;
}
public static void main(String[] args){
int i,j,cas;
Scanner sc = new Scanner(System.in);
preprocess();
cas = sc.nextInt();
while(cas-->0){
n = sc.nextInt();m = sc.nextBigInteger();
if(m.compareTo(BigInteger.valueOf(1))==0) System.out.println(1);
else if(m.compareTo(BigInteger.valueOf(2))==0) System.out.println(0);
else if(m.compareTo(BigInteger.valueOf(3))==0) System.out.println(1);
else if(m.compareTo(BigInteger.valueOf(4))==0) System.out.println(1);
else{
int p = bin(m);
System.out.println(m.subtract(f[p-1]).mod(mod));
}
}
}
public static class MyScanner {
BufferedReader br;
StringTokenizer st;
public MyScanner() {
br = new BufferedReader(new InputStreamReader(System.in));
}
String next() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
long nextLong() {
return Long.parseLong(next());
}
double nextDouble() {
return Double.parseDouble(next());
}
String nextLine(){
String str = "";
try {
str = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
}
}