3 1 2 5
9 97 841
/*
题意:
求{[sqrt(2)+sqrt(3)]^2n}%1024取整
题解:
见上图
*/
#include <stdio.h>
#include <string.h>
#include<iostream>
#include <algorithm>
using namespace std;
#define LL __int64
struct node
{
LL maxtri[6][6];
};
node res, roi;
LL n, kk = 1024;
node operator * (node &a, node &b)
{
node ans;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
ans.maxtri[i][j] = 0;
for (int k = 0; k < 2; k++)
{
ans.maxtri[i][j] += a.maxtri[i][k] * (b.maxtri[k][j]%kk)%kk;
ans.maxtri[i][j] %= kk;
}
}
}
return ans;
}
void quickmuti(LL nn)
{
node temp;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
temp.maxtri[i][j] = (i == j);
}
}
while (nn)
{
if (nn & 1)
{
temp = temp*roi;
}
nn >>= 1;
roi = roi*roi;
}
res = temp;
}
void init()
{
memset(roi.maxtri, 0, sizeof(roi.maxtri));
memset(res.maxtri, 0, sizeof(res.maxtri));
roi.maxtri[0][0] = roi.maxtri[1][1] = 5;
roi.maxtri[1][0] = 2;
roi.maxtri[0][1] = 12;
res.maxtri[0][0] = 5;
res.maxtri[1][0] = 2;
}
int main()
{
int t;
cin >> t;
while (t--)
{
scanf("%I64d", &n);
int num[3] = { 1,1,2 };
if (n == 1)
{
cout << '9' << endl;
continue;
}
init();
quickmuti(n-1);
LL ans = 0;
ans = (LL)(res.maxtri[0][0]*5 + 2*res.maxtri[0][1])%kk;
printf("%I64d\n", (2*ans-1)%kk);
}
return 0;
}