struct M
{
LL a[3][3];
void init1()//化单位矩阵
{
memset(a, 0, sizeof(a));
a[0][0]=1;
a[1][1]=1;
a[2][2]=1;
}
void init0()//清空矩阵
{
memset(a, 0, sizeof(a));
}
};
M mul (M a,M b)
{
M ans;
for (int i=0; i<maxn; i++)
{
for (int j=0; j<maxn; j++)
{
ans.a[i][j]=0;
for (int k=0; k<maxx; k++)
{
ans.a[i][j]+=a.a[i][k]*b.a[k][j];
ans.a[i][j]%=mod;
}
}
}
return ans;
}
M qpow(M a,LL n)//快速幂部分
{
M ans;
ans.init();
//这里也可以初始化我要b*a^n中的b矩阵
while(n)
{
if (n&1)ans=mul(ans,a);
a=mul(a,a);
n/=2;
}
return ans;
}
void output(M a)//随时打印判断
{
for(int i=0; i<3; ++i)
{
for(int j=0; j<3; ++j)
{
cout << a.a[i][j] << " ";
}
cout << endl;
}
}