1. 程式人生 > >整數快速冪(取模)、矩陣快速冪及其應用

整數快速冪(取模)、矩陣快速冪及其應用

 1 #include <cstdio>
 2 #include <cstring>
 3 typedef long long ll;
 4 const int mod = 998244353;
 5 struct Matrix {
 6     ll x[2][2];
 7 };
 8 Matrix Mmul(Matrix a, Matrix b) {
 9     Matrix tmp;
10     memset(tmp.x, 0, sizeof(tmp.x));
11     for(int i = 0; i < 2; i++) {
12         for
(int j = 0; j < 2; j++) { 13 for(int k = 0; k < 2; k++) { 14 tmp.x[i][j] = (tmp.x[i][j] + a.x[i][k] * b.x[k][j] % mod) % mod; 15 } 16 } 17 } 18 return tmp; 19 } 20 Matrix Mqpow(Matrix a, ll n) { 21 Matrix tmp; 22 for(int i = 0; i < 2
; i++) { 23 for(int j = 0; j < 2; j++) { 24 tmp.x[i][j] = i == j ? 1 : 0; 25 } 26 } 27 28 while(n) { 29 if(n&1) 30 tmp = Mmul(tmp, a); 31 a = Mmul(a, a); 32 n >>= 1; 33 } 34 return tmp; 35 } 36 int main()
37 { 38 ll k; 39 while(scanf("%lld", &k) != EOF) { 40 Matrix st; 41 st.x[0][0] = 1; st.x[0][1] = 1; 42 st.x[1][0] = 1; st.x[1][1] = 0; 43 44 Matrix init; 45 init.x[0][0] = 1; init.x[0][1] = 0; 46 init.x[1][0] = 1; init.x[1][1] = 0; 47 48 st = Mqpow(st, 2 * k + 1); 49 st = Mmul(st, init); 50 printf("%lld\n", (st.x[0][0] - 1 + mod) % mod); 51 } 52 return 0; 53 }