解题思路:详见挑战P202。
#include<cstdio>
#include<cstring>
using namespace std;
int m[3][3]={{2,1,0},{2,2,2},{0,1,2}};
struct mat
{
int s[3][3];
mat()
{
memset(s,0,sizeof(s));
}
};
mat matmul(mat a,mat b)
{
mat tp;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
int r=0;
for(int k=0;k<3;k++)
{
r+=a.s[i][k]*b.s[k][j];
r%=10007;
}
tp.s[i][j]=r;
}
}
return tp;
}
void solve(int n)
{
mat a,p;
memcpy(p.s,m,sizeof(m));
for(int i=0;i<3;i++) a.s[i][i]=1;
while(n)
{
if(n&1)
{
a=matmul(a,p);
}
n>>=1;
p=matmul(p,p);
}
printf("%d\n",a.s[0][0]);
}
int main()
{
int T,n;
//freopen("t.txt","r",stdin);
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
solve(n);
}
return 0;
}