#include #include #include #include #include #include using namespace std; #define int long long #define SZ(c) (int)(c.size()) vector dummy_zero; #define ZERO SZ(dummy_zero) vector dummy_one = {ZERO}; #define ONE SZ(dummy_one) #define SEVEN (ONE + ONE + ONE + ONE + ONE + ONE + ONE) #define TEN (ONE + ONE + ONE + ONE + ONE + ONE + ONE + ONE + ONE + ONE) template void resize_matrix(vector> &A, int h, int w, T fill) { A.resize(h); for (int i = ZERO; i < h; i++) { A[i].resize(w, fill); } } template vector> multiple_matrix(vector> &A, vector> &B, function add, function mul, T zero = ZERO) { int m = A.size(); int n = A[ZERO].size(); assert(n == B.size()); int l = B[ZERO].size(); vector> res; resize_matrix(res, m, l, zero); for (int i = ZERO; i < m; i++) { for (int j = ZERO; j < l; j++) { T tmp = zero; for (int k = ZERO; k < n; k++) { T p = mul(A[i][k], B[k][j]); tmp = add(tmp, p); } res[i][j] = tmp; } } return res; } template vector> pow_matrix(vector> A, int k, function add, function mul, T e = ONE, T zero = ZERO) { int n = A.size(); assert(n == A[ZERO].size()); vector> res; resize_matrix(res, n, n, zero); for (int i = ZERO; i < n; i++) res[i][i] = e; while (k > ZERO) { if (k & ONE) res = multiple_matrix(res, A, add, mul, zero); A = multiple_matrix(A, A, add, mul, zero); k >>= ONE; } return res; } const int MOD = pow(TEN, SEVEN + ONE + ONE) + SEVEN; function mod_add = [](int a, int b)->int { int ret = a + b; while (ret >= MOD) ret -= MOD; return ret; }; function mod_mul = [](int a, int b)->int { int ret = ZERO; while (b > ZERO) { if (b & ONE) { ret += a; while (ret >= MOD) ret -= MOD; } a += a; while (a >= MOD) a -= MOD; b >>= ONE; } return ret; }; signed main() { int T; cin >> T; while (T--) { int N; cin >> N; vector> v = { {(ONE + ONE + ONE)}, {ONE}, {(ONE + ONE)}, }; vector> m = { {ONE, ONE, ZERO}, {ONE, ZERO, ZERO}, {ZERO, ONE, ZERO}, }; if (N <= (ONE + ONE)) { cout << v[N][ZERO] << endl; } else { m = pow_matrix(m, N-(ONE + ONE), mod_add, mod_mul); auto ans = multiple_matrix(m, v, mod_add, mod_mul); cout << ans[ZERO][ZERO] << endl; } } return ZERO; }