diff --git a/youtube/BOJ2749.java b/youtube/BOJ2749.java new file mode 100644 index 0000000..dddccf8 --- /dev/null +++ b/youtube/BOJ2749.java @@ -0,0 +1,67 @@ +import java.io.*; + +public class Main { + // 문제에서 요구한 나누는 수 + final static long MOD = 1000000; + + public static void main(String[] args) throws IOException { + // 입력 속도를 위해 BufferedReader 사용 + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + // n은 최대 100경(10^18)이므로 long 사용 + long n = Long.parseLong(br.readLine()); + + // F_0 = 0 + if (n == 0) { + System.out.println(0); + return; + } + + // 피보나치 Q-행렬 기본값 + long[][] A = {{1, 1}, {1, 0}}; + + // 행렬 거듭제곱으로 Fn 구하기 + long[][] result = power(A, n); + + // M^n의 [0][1] 성분이 F_n임 + System.out.println(result[0][1] % MOD); + } + + // 분할 정복을 이용한 거듭제곱 (O(logN)) + private static long[][] power(long[][] A, long n) { + // 지수가 1이면 자기 자신 반환 (Base Case) + if (n == 1) { + // 반환할 때도 모듈러 연산 안전하게 한 번 해줌 + return new long[][] { + {A[0][0] % MOD, A[0][1] % MOD}, + {A[1][0] % MOD, A[1][1] % MOD} + }; + } + + // 1. 반으로 쪼개서 구함 (Divide) + long[][] half = power(A, n / 2); + + // 2. 구한 것을 제곱함 (Conquer) + long[][] result = multiply(half, half); + + // 3. 홀수라면 A를 한 번 더 곱해줌 + if (n % 2 == 1) { + result = multiply(result, A); + } + + return result; + } + + // 행렬 곱셈 함수 (나머지 연산 포함) + private static long[][] multiply(long[][] o1, long[][] o2) { + long[][] ret = new long[2][2]; + + // 2x2 행렬 곱셈 공식 + 모듈러 연산 + ret[0][0] = (o1[0][0] * o2[0][0] + o1[0][1] * o2[1][0]) % MOD; + ret[0][1] = (o1[0][0] * o2[0][1] + o1[0][1] * o2[1][1]) % MOD; + ret[1][0] = (o1[1][0] * o2[0][0] + o1[1][1] * o2[1][0]) % MOD; + ret[1][1] = (o1[1][0] * o2[0][1] + o1[1][1] * o2[1][1]) % MOD; + + return ret; + } +} diff --git "a/\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225/P13398_\354\227\260\354\206\215\353\220\234\354\240\225\354\210\230\354\235\230\355\225\251.java" "b/\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225/P13398_\354\227\260\354\206\215\355\225\2512.java" similarity index 94% rename from "\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225/P13398_\354\227\260\354\206\215\353\220\234\354\240\225\354\210\230\354\235\230\355\225\251.java" rename to "\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225/P13398_\354\227\260\354\206\215\355\225\2512.java" index 4788c7e..26d0fd9 100644 --- "a/\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225/P13398_\354\227\260\354\206\215\353\220\234\354\240\225\354\210\230\354\235\230\355\225\251.java" +++ "b/\353\217\231\354\240\201\352\263\204\355\232\215\353\262\225/P13398_\354\227\260\354\206\215\355\225\2512.java" @@ -1,7 +1,7 @@ import java.io.*; import java.util.StringTokenizer; -public class P13398_연속된정수의합 { +public class P13398_연속합2 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); @@ -36,3 +36,4 @@ public static void main(String[] args) throws IOException { br.close(); } } + diff --git "a/\354\240\225\353\240\254/P11004_K\353\262\210\354\247\270\354\210\230.java" "b/\354\240\225\353\240\254/P11004_K\353\262\210\354\247\270\354\210\230.java" index e6833e4..a0aebe0 100644 --- "a/\354\240\225\353\240\254/P11004_K\353\262\210\354\247\270\354\210\230.java" +++ "b/\354\240\225\353\240\254/P11004_K\353\262\210\354\247\270\354\210\230.java" @@ -3,7 +3,7 @@ import java.io.InputStreamReader; import java.util.StringTokenizer; -public class Main { +public class P11004_K번째수 { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(in.readLine()); diff --git "a/\354\240\225\353\240\254/P1377_\353\262\204\353\270\224\354\206\214\355\212\2701.java" "b/\354\240\225\353\240\254/P1377_\353\262\204\353\270\224\354\240\225\353\240\2541.java" similarity index 93% rename from "\354\240\225\353\240\254/P1377_\353\262\204\353\270\224\354\206\214\355\212\2701.java" rename to "\354\240\225\353\240\254/P1377_\353\262\204\353\270\224\354\240\225\353\240\2541.java" index aea547c..725f9d5 100644 --- "a/\354\240\225\353\240\254/P1377_\353\262\204\353\270\224\354\206\214\355\212\2701.java" +++ "b/\354\240\225\353\240\254/P1377_\353\262\204\353\270\224\354\240\225\353\240\2541.java" @@ -2,7 +2,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; -public class P1377_버블소트1 { +public class P1377_버블정렬1 { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(reader.readLine()); @@ -36,3 +36,4 @@ public int compareTo(mData o) {//value 기준 오름차순 정렬 } } + diff --git "a/\354\240\225\353\240\254/P1517_\353\262\204\353\270\224\354\206\214\355\212\2702.java" "b/\354\240\225\353\240\254/P1517_\353\262\204\353\270\224\354\240\225\353\240\2542.java" similarity index 94% rename from "\354\240\225\353\240\254/P1517_\353\262\204\353\270\224\354\206\214\355\212\2702.java" rename to "\354\240\225\353\240\254/P1517_\353\262\204\353\270\224\354\240\225\353\240\2542.java" index b3cce26..bef6541 100644 --- "a/\354\240\225\353\240\254/P1517_\353\262\204\353\270\224\354\206\214\355\212\2702.java" +++ "b/\354\240\225\353\240\254/P1517_\353\262\204\353\270\224\354\240\225\353\240\2542.java" @@ -3,7 +3,7 @@ import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; -public class P1517_버블소트2 { +public class P1517_버블정렬2 { public static int[] A, tmp; public static long result; public static void main(String[] args) throws IOException { @@ -58,3 +58,4 @@ private static void merget_sort(int s, int e) { } } + diff --git "a/\355\203\220\354\203\211/P1206_DFS\354\231\200BFS.java" "b/\355\203\220\354\203\211/P1260_DFS\354\231\200BFS.java" similarity index 94% rename from "\355\203\220\354\203\211/P1206_DFS\354\231\200BFS.java" rename to "\355\203\220\354\203\211/P1260_DFS\354\231\200BFS.java" index 9e991c2..932aee5 100644 --- "a/\355\203\220\354\203\211/P1206_DFS\354\231\200BFS.java" +++ "b/\355\203\220\354\203\211/P1260_DFS\354\231\200BFS.java" @@ -1,5 +1,5 @@ import java.util.*; -public class P1206_DFS와BFS { +public class P1260_DFS와BFS { static boolean visited[]; static ArrayList[] A; public static void main(String[] args) { @@ -57,3 +57,4 @@ private static void BFS(int node) { // BFS구현 } } } +