- #include <stdio.h>
- #include <iostream>
- using namespace std;
- typedef unsigned long long ulong;
- typedef unsigned int uint;
- typedef uint** Matrix;
- const ulong MOD = 4294967143LL;
- const int ROWS = 11;
- const int POW = 65;
- const int MANY = 8;
- const int PMANY = 1 << MANY;
- /*class Matrix {
- public:
- int n;
- ulong ** a;
- Matrix(int n_ = ROWS) : n(n_) {
- a = new ulong*[n];
- for (int i = 0; i < n; i++) {
- a[i] = new ulong[n];
- for (int j = 0; j < n; j++) {
- a[i][j] = 0;
- }
- }
- }
- ulong * operator[] (size_t x) {
- return a[x];
- }
- ulong * operator[] (size_t x) const {
- return a[x];
- }
- };*/
- Matrix * pows;
- Matrix ** tPows;
- Matrix tmp;
- Matrix ans;
- void mul(Matrix const & a, Matrix const & b, Matrix & c);
- void mul3(Matrix const & a, Matrix const & b, Matrix & c) {
- uint * aa;
- uint * bb;
- ulong v;
- for (int i = 0; i < ROWS; i++) {
- aa = a[i];
- for (int j = 0; j < ROWS; j++) {
- if (((i + j) & 1) == 0) {
- c[i][j] = 0;
- continue;
- }
- if (j < i) {
- c[i][j] = c[j][i];
- continue;
- }
- if (i > ROWS - i - 1) {
- c[i][j] = c[ROWS - i - 1][ROWS - j - 1];
- continue;
- }
- if (j > ROWS - i - 1) {
- c[i][j] = c[ROWS - j - 1][ROWS - i - 1];
- continue;
- }
- bb = b[j];
- v = 0;
- for (int k = 0; k < ROWS; k++) {
- if (aa[k] != 0 && bb[k] != 0) {
- v += (ulong) aa[k] * (ulong) bb[k];
- if (v >= MOD) {
- v %= MOD;
- }
- }
- }
- c[i][j] = (uint)v;
- }
- }
- }
- void mul4(Matrix const & a, Matrix const & b, Matrix & c) {
- uint * aa;
- uint * bb;
- ulong v;
- for (int i = 0; i < ROWS; i++) {
- aa = a[i];
- for (int j = 0; j < ROWS; j++) {
- if (((i + j) & 1) == 1) {
- c[i][j] = 0;
- continue;
- }
- if (j < i) {
- c[i][j] = c[j][i];
- continue;
- }
- if (i > ROWS - i - 1) {
- c[i][j] = c[ROWS - i - 1][ROWS - j - 1];
- continue;
- }
- if (j > ROWS - i - 1) {
- c[i][j] = c[ROWS - j - 1][ROWS - i - 1];
- continue;
- }
- bb = b[j];
- v = 0;
- for (int k = 0; k < ROWS; k++) {
- if (aa[k] != 0 && bb[k] != 0) {
- v += (ulong) aa[k] * (ulong) bb[k];
- if (v >= MOD) {
- v %= MOD;
- }
- }
- }
- c[i][j] = (uint)v;
- }
- }
- }
- void mul2(Matrix const & a, Matrix const & b, Matrix & c) {
- uint * aa;
- uint * bb;
- ulong v;
- for (int i = 0; i < ROWS; i++) {
- aa = a[i];
- for (int j = 0; j < ROWS; j++) {
- if (j < i) {
- c[i][j] = c[j][i];
- continue;
- }
- if (i > ROWS - i - 1) {
- c[i][j] = c[ROWS - i - 1][ROWS - j - 1];
- continue;
- }
- if (j > ROWS - i - 1) {
- c[i][j] = c[ROWS - j - 1][ROWS - i - 1];
- continue;
- }
- bb = b[j];
- v = 0;
- for (int k = 0; k < ROWS; k++) {
- if (aa[k] != 0 && bb[k] != 0) {
- v += (ulong) aa[k] * (ulong) bb[k];
- if (v >= MOD) {
- v %= MOD;
- }
- }
- }
- c[i][j] = (uint)v;
- }
- }
- }
- ulong go(ulong n) {
- if (n == 1) {
- return 10;
- }
- if ((n & 1) == 1) {
- return 0;
- }
- --n;
- for (int i = 0; i < ROWS; i++) {
- for (int j = 0; j < ROWS; j++) {
- ans[i][j] = i == j ? 1 : 0;
- }
- }
- // bool ok = (n & 1) == 0;
- for (int i = 0; i < 64; i += MANY) {
- int t = n & (PMANY - 1);
- if (t != 0) {
- // if (ok)
- // mul4(ans, tPows[i + 1][t], tmp);
- //mul2(ans, tPows[i + 1][t], tmp);
- // else
- mul3(ans, tPows[i + 1][t], tmp);
- //mul2(ans, tPows[i + 1][t], tmp);
- Matrix e = ans;
- ans = tmp;
- tmp = e;
- }
- n >>= MANY;
- }
- ulong ret = 0;
- for (int i = 1; i < ROWS; i++) {
- ret += ans[i][i - 1];
- if (ret >= MOD) {
- ret -= MOD;
- }
- if (i < ROWS - 1) {
- ret += ans[i][i + 1];
- if (ret >= MOD) {
- ret -= MOD;
- }
- }
- }
- return ret;
- }
- void mul(Matrix const & a, Matrix const & b, Matrix & c) {
- for (int i = 0; i < ROWS; i++) {
- for (int j = 0; j < ROWS; j++) {
- ulong v = 0;
- for (int k = 0; k < ROWS; k++) {
- v += (ulong) a[i][k] * b[k][j];
- if (v >= MOD) {
- v %= MOD;
- }
- }
- c[i][j] = (uint)v;
- }
- }
- }
- void makeMatrix(Matrix & a) {
- a = new uint*[ROWS];
- for (int i = 0; i < ROWS; i++) {
- a[i] = new uint[ROWS];
- for (int j = 0; j < ROWS; j++) {
- a[i][j] = 0;
- }
- }
- }
- int main() {
- freopen("in.txt", "r", stdin);
- freopen("out.txt", "w", stdout);
- pows = new Matrix[POW];
- for (int i = 0; i < POW; i++) {
- makeMatrix(pows[i]);
- }
- makeMatrix(tmp);
- makeMatrix(ans);
- for (int i = 0; i < ROWS; i++) {
- pows[0][i][i] = 1;
- }
- for (int i = 0; i < ROWS; i++) {
- if (i > 0) {
- pows[1][i][i - 1] = 1;
- }
- if (i < ROWS - 1) {
- pows[1][i][i + 1] = 1;
- }
- }
- for (int i = 2; i < POW; i++) {
- // if (i == 2)
- // mul2(pows[i - 1], pows[i - 1], pows[i]);
- // else
- mul4(pows[i - 1], pows[i - 1], pows[i]);
- }
- tPows = new Matrix*[POW];
- for (int i = 1; i < POW; i += MANY) {
- tPows[i] = new Matrix[PMANY];
- for (int j = 0; j < PMANY; j++) {
- bool ok = true;
- for (int k = 0; k < MANY; k++) {
- if (((j >> k) & 1) == 1 && i + k > 64) {
- ok = false;
- break;
- }
- }
- if (!ok) {
- continue;
- }
- if (i == 1 && j != 0 && (j & 1) == 0) {
- continue;
- }
- makeMatrix(tPows[i][j]);
- Matrix & e = tPows[i][j];
- if (j == 0) {
- for (int k = 0; k < ROWS; k++) {
- e[k][k] = 1;
- }
- continue;
- }
- for (int k = MANY - 1; k >= 0; k--) {
- if (((j >> k) & 1) == 1) {
- if (i == 1 && (j & 1) == 1) {
- mul3(pows[i + k], tPows[i][j ^ (1 << k)], e);
- //mul2(pows[i + k], tPows[i][j ^ (1 << k)], e);
- } else {
- mul4(pows[i + k], tPows[i][j ^ (1 << k)], e);
- //mul2(pows[i + k], tPows[i][j ^ (1 << k)], e);
- }
- break;
- }
- }
- }
- }
- int n;
- scanf("%d", &n);
- for (int i = 0; i < n; i++) {
- ulong x;
- scanf("%lld", &x);
- printf("%lld\n", go(x));
- }
- return 0;
- }