From 68f05d2f5009a6bbe94ab0594b2a642c3dfab455 Mon Sep 17 00:00:00 2001 From: songyc macbook Date: Fri, 24 Oct 2025 23:57:54 +0900 Subject: [PATCH] 20251024 baekjoon --- code_study/Baekjoon/c/11444.c | 71 +++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 code_study/Baekjoon/c/11444.c diff --git a/code_study/Baekjoon/c/11444.c b/code_study/Baekjoon/c/11444.c new file mode 100644 index 0000000..0af3b3d --- /dev/null +++ b/code_study/Baekjoon/c/11444.c @@ -0,0 +1,71 @@ +#include +// Fn | 1 1 | ^n-1 F1(1) +// Fn-1 | 1 0 | F0(0) + +#define MOD 1000000007 + +typedef long long matrix[2][2]; + +void multyply_matrix(matrix A, matrix B, matrix result); +void power_matrix(matrix A, long long exp, matrix result); + +int main() { + long long n; + scanf("%lld", &n); + + if (n <= 1) { + printf("%lld\n", n); + return 0; + } + + matrix A = {{1, 1}, {1, 0}}; + matrix result_matrix; + + power_matrix(A, n - 1, result_matrix); + + printf("%lld\n", result_matrix[0][0]); + + return 0; +} + +void multyply_matrix(matrix A, matrix B, matrix result) { + matrix temp; + temp[0][0] = (A[0][0] * B[0][0] + A[0][1] * B[1][0]) % MOD; + temp[0][1] = (A[0][0] * B[0][1] + A[0][1] * B[1][1]) % MOD; + temp[1][0] = (A[1][0] * B[0][0] + A[1][1] * B[1][0]) % MOD; + temp[1][1] = (A[1][0] * B[0][1] + A[1][1] * B[1][1]) % MOD; + + result[0][0] = temp[0][0]; + result[0][1] = temp[0][1]; + result[1][0] = temp[1][0]; + result[1][1] = temp[1][1]; +} + +void power_matrix(matrix A, long long exp, matrix result) { + if (exp == 0) { + result[0][0] = 1; result[0][1] = 0; + result[1][0] = 0; result[1][1] = 1; + return; + } + + if (exp == 1) { + result[0][0] = A[0][0]; result[0][1] = A[0][1]; + result[1][0] = A[1][0]; result[1][1] = A[1][1]; + return; + } + + matrix half; + power_matrix(A, exp / 2, half); + + matrix temp; + multyply_matrix(half, half, temp); + + if (exp % 2 == 1) { + multyply_matrix(temp, A, result); + } else { + result[0][0] = temp[0][0]; + result[0][1] = temp[0][1]; + result[1][0] = temp[1][0]; + result[1][1] = temp[1][1]; + } +}