1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | #include <iostream> #include <vector> #include <math.h> #include <string.h> #define ll long long #define MOD 1'000'000 using namespace std; struct metrix { ll arr[2][2]; metrix() { memset(arr, 0, sizeof(arr)); } metrix(int t) { /* | 1 0 | | 0 1 | */ if (t == 0) { arr[0][0] = 1; arr[0][1] = 0; arr[1][0] = 0; arr[1][1] = 1; } /* | 1 1 | | 1 0 | */ else if (t == 1) { arr[0][0] = 1; arr[0][1] = 1; arr[1][0] = 1; arr[1][1] = 0; } } }; metrix m; metrix mult(metrix a, metrix b) { metrix res; res.arr[0][0] = (a.arr[0][0] * b.arr[0][0] + a.arr[0][1] * b.arr[1][0]) % MOD; res.arr[0][1] = (a.arr[0][0] * b.arr[0][1] + a.arr[0][1] * b.arr[1][1]) % MOD; res.arr[1][0] = (a.arr[1][0] * b.arr[0][0] + a.arr[1][1] * b.arr[1][0]) % MOD; res.arr[1][1] = (a.arr[1][0] * b.arr[0][1] + a.arr[1][1] * b.arr[1][1]) % MOD; return res; } metrix pow(int n) { if (n == 0) return metrix(0); else { if (n % 2 == 1) { metrix res = mult(pow(n / 2), pow(n / 2)); return mult(res, metrix(1)); } else { metrix res = mult(pow(n / 2), pow(n / 2)); return res; } } } int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); ll N; cin >> N; metrix res(0);// 단위행렬 metrix a(1); // 1,1,1,0 while (N > 0) { if (N % 2 == 1) { res = mult(res, a); } a = mult(a, a); N /= 2; } //metrix res = pow(N); cout << res.arr[1][0]; return 0; } | cs |
76번 라인처럼 하면 AC받고
84번 라인 처럼 pow함수 만들어서 처리하면 시간초과 나는데
시간 복잡도 상수 빼면 똑같은거 아님?
pow 함수에서 똑같은 함수를 2번 호출하는게 문제되는듯
오 맞네 ㄳㄳ