您的位置:首页 > 编程语言 > Java开发

Hdu 5351 MZL's Border (找规律+Java高精度)

2016-07-13 21:09 405 查看
解析:找到最大的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;
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: