문제 : boj11444
분할 정복을 이용한 거듭제곱 최적화(이 글)을 보면 풀 수 있다!
코드 : github
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
private static final long MOD = 1_000_000_007l;
private long[][] matrixMult(long[][] a, long[][] b) {
long[][] arr = new long[2][2];
arr[0][0] = (a[0][0]*b[0][0]%MOD + a[0][1]*b[1][0]%MOD)%MOD;
arr[1][0] = (a[0][0]*b[0][1]%MOD + a[0][1]*b[1][1]%MOD)%MOD;
arr[0][1] = (a[1][0]*b[0][0]%MOD + a[1][1]*b[1][0]%MOD)%MOD;
arr[1][1] = (a[1][0]*b[0][1]%MOD + a[1][1]*b[1][1]%MOD)%MOD;
return arr;
}
private long[][] fibo(long n) {
if (n == 1) {
long[][] arr = {{1,1},{1,0}};
return arr;
}
long[][] tmp = fibo(n/2);
if (n%2==1) {
return matrixMult(matrixMult(tmp, tmp), fibo(1));
} else {
return matrixMult(tmp, tmp);
}
}
private void solution() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
long n = Long.parseLong(br.readLine());
System.out.println(fibo(n)[0][1]);
}
public static void main(String[] args) throws Exception {
new Main().solution();
}
}
'PS > BOJ' 카테고리의 다른 글
백준 15492 자바 - 뒤집기 (boj 15492 java) (0) | 2022.04.16 |
---|---|
백준 19585 자바 - 전설 (boj 19585 java) (0) | 2022.04.15 |
백준 24510 자바 - 시간복잡도를 배운 도도 (boj 24510 java) (0) | 2022.04.13 |
백준 11004 자바 - K번째 수 (boj 11004 java) (0) | 2022.04.11 |
백준 14584 자바 - 암호 해독 (boj 14584 java) (0) | 2022.04.10 |
댓글