#include <bits/stdc++.h>
#define pb push_back
#define MOD 1000000007
using namespace std;
typedef long long ll;
typedef long double ld;
vector<vector<ll>> defaultMatrix = {{0,0,1}, {1,0,1}, {0,1,0}};
vector<vector<ll>> multiplicationResult(3);
vector<ll> finalResult;
void multiplyMatrix(vector<vector<ll>> &mat, vector<vector<ll>> &mat2) {
for(int i = 0; i < 3; i++)
multiplicationResult[i].clear();
for(ll i = 0; i < 3; i++) {
for(ll j = 0; j < 3; j++) {
ll sum = 0;
for(ll k = 0; k < 3; k++) {
ll temp = (mat[i][k]%MOD * mat2[k][j]%MOD)%MOD;
sum = (sum%MOD + temp%MOD)%MOD;
}
multiplicationResult[i].pb(sum);
}
}
mat = multiplicationResult;
}
void vecMultiply(vector<ll> &v, vector<vector<ll>> &mat) {
finalResult.clear();
for(ll i = 0; i < 3; i++) {
ll sum = 0;
for(ll j = 0; j < 3; j++) {
ll temp = (v[j]%MOD * mat[j][i]%MOD)%MOD;
sum = (sum%MOD + temp%MOD)%MOD;
}
finalResult.pb(sum);
}
v = finalResult;
}
void exponentiate(vector<vector<ll>> &mat, ll n) {
if(n == 0 || n == 1)
return;
exponentiate(mat, n / 2);
multiplyMatrix(mat, mat);
if(n&1)
multiplyMatrix(mat, defaultMatrix);
}
ll matrixExponentiation(ll n) {
vector<vector<ll>> mat = defaultMatrix;
vector<ll> v = {1, 0, 1};
if(n <= 2)
return v[n];
exponentiate(mat, n - 2);
vecMultiply(v, mat);
return v[2];
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
ll t;
cin>>t;
while(t--) {
ll n;
cin>>n;
ll matrix = matrixExponentiation(n);
cout<<matrix<<endl;
}
return 0;
}
ICAgICNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgogICAgI2RlZmluZSBwYiBwdXNoX2JhY2sKICAgICNkZWZpbmUgTU9EIDEwMDAwMDAwMDcKICAgICAKICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgICAgCiAgICB0eXBlZGVmIGxvbmcgbG9uZyBsbDsKICAgIHR5cGVkZWYgbG9uZyBkb3VibGUgbGQ7CiAgICAgCiAgICB2ZWN0b3I8dmVjdG9yPGxsPj4gZGVmYXVsdE1hdHJpeCA9IHt7MCwwLDF9LCB7MSwwLDF9LCB7MCwxLDB9fTsKICAgIHZlY3Rvcjx2ZWN0b3I8bGw+PiBtdWx0aXBsaWNhdGlvblJlc3VsdCgzKTsKICAgIHZlY3RvcjxsbD4gZmluYWxSZXN1bHQ7CiAgICAgCiAgICB2b2lkIG11bHRpcGx5TWF0cml4KHZlY3Rvcjx2ZWN0b3I8bGw+PiAmbWF0LCB2ZWN0b3I8dmVjdG9yPGxsPj4gJm1hdDIpIHsKICAgIAlmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQogICAgCQltdWx0aXBsaWNhdGlvblJlc3VsdFtpXS5jbGVhcigpOwogICAgIAogICAgCWZvcihsbCBpID0gMDsgaSA8IDM7IGkrKykgewogICAgCQlmb3IobGwgaiA9IDA7IGogPCAzOyBqKyspIHsKICAgIAkJCWxsIHN1bSA9IDA7CiAgICAJCQlmb3IobGwgayA9IDA7IGsgPCAzOyBrKyspIHsKICAgIAkJCQlsbCB0ZW1wID0gKG1hdFtpXVtrXSVNT0QgKiBtYXQyW2tdW2pdJU1PRCklTU9EOwogICAgCQkJCXN1bSA9IChzdW0lTU9EICsgdGVtcCVNT0QpJU1PRDsKICAgIAkJCX0KICAgIAkJCW11bHRpcGxpY2F0aW9uUmVzdWx0W2ldLnBiKHN1bSk7CiAgICAJCX0KICAgIAl9CiAgICAJbWF0ID0gbXVsdGlwbGljYXRpb25SZXN1bHQ7CiAgICB9CiAgICAgCiAgICB2b2lkIHZlY011bHRpcGx5KHZlY3RvcjxsbD4gJnYsIHZlY3Rvcjx2ZWN0b3I8bGw+PiAmbWF0KSB7CiAgICAJZmluYWxSZXN1bHQuY2xlYXIoKTsKICAgIAlmb3IobGwgaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgIAkJbGwgc3VtID0gMDsKICAgIAkJZm9yKGxsIGogPSAwOyBqIDwgMzsgaisrKSB7CiAgICAJCQlsbCB0ZW1wID0gKHZbal0lTU9EICogbWF0W2pdW2ldJU1PRCklTU9EOwogICAgCQkJc3VtID0gKHN1bSVNT0QgKyB0ZW1wJU1PRCklTU9EOwogICAgCQl9CiAgICAJCWZpbmFsUmVzdWx0LnBiKHN1bSk7CiAgICAJfQogICAgCXYgPSBmaW5hbFJlc3VsdDsKICAgIH0KICAgICAKICAgIHZvaWQgZXhwb25lbnRpYXRlKHZlY3Rvcjx2ZWN0b3I8bGw+PiAmbWF0LCBsbCBuKSB7CiAgICAJaWYobiA9PSAwIHx8IG4gPT0gMSkKICAgIAkJcmV0dXJuOwogICAgCWV4cG9uZW50aWF0ZShtYXQsIG4gLyAyKTsKICAgIAltdWx0aXBseU1hdHJpeChtYXQsIG1hdCk7CiAgICAJaWYobiYxKQogICAgCQltdWx0aXBseU1hdHJpeChtYXQsIGRlZmF1bHRNYXRyaXgpOwogICAgfQogICAgIAogICAgbGwgbWF0cml4RXhwb25lbnRpYXRpb24obGwgbikgewogICAgCXZlY3Rvcjx2ZWN0b3I8bGw+PiBtYXQgPSBkZWZhdWx0TWF0cml4OwogICAgCXZlY3RvcjxsbD4gdiA9IHsxLCAwLCAxfTsKICAgIAlpZihuIDw9IDIpCiAgICAJCXJldHVybiB2W25dOwogICAgCWV4cG9uZW50aWF0ZShtYXQsIG4gLSAyKTsKICAgIAl2ZWNNdWx0aXBseSh2LCBtYXQpOwogICAgCXJldHVybiB2WzJdOwogICAgfQogICAgIAogICAgaW50IG1haW4oKSB7CiAgICAgICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICAgICAgY2luLnRpZShOVUxMKTsKICAgICAgICBsbCB0OwogICAgICAgIGNpbj4+dDsKICAgICAgICB3aGlsZSh0LS0pIHsKICAgICAgICAJbGwgbjsKICAgICAgICAJY2luPj5uOwogICAgICAgIAlsbCBtYXRyaXggPSBtYXRyaXhFeHBvbmVudGlhdGlvbihuKTsKICAgICAgICAJY291dDw8bWF0cml4PDxlbmRsOwogICAgICAgIH0KICAgICAKICAgICAgICByZXR1cm4gMDsKICAgIH0g