voidmul(int a[][2], int b[][2], int c[][2]) { int temp[][2] = {{0, 0}, {0, 0}}; for (int i = 0; i < 2; i ++ ) for (int j = 0; j < 2; j ++ ) for (int k = 0; k < 2; k ++ ) { longlong x = temp[i][j] + (longlong)a[i][k] * b[k][j]; temp[i][j] = x % MOD; } for (int i = 0; i < 2; i ++ ) for (int j = 0; j < 2; j ++ ) c[i][j] = temp[i][j]; }
intf_final(longlong n) { int x[2] = {1, 1};
int res[][2] = {{1, 0}, {0, 1}}; int t[][2] = {{1, 1}, {1, 0}}; longlong k = n - 1; while (k) { if (k&1) mul(res, t, res); mul(t, t, t); k >>= 1; }
int c[2] = {0, 0}; for (int i = 0; i < 2; i ++ ) for (int j = 0; j < 2; j ++ ) { longlong r = c[i] + (longlong)x[j] * res[j][i]; c[i] = r % MOD; }