1 struct Matrix
2 {
3 int a[3][3];
4 Matrix()
5 {
6 memset(a,0,sizeof(a));
7 }
8 void init()
9 {
10 for(int i=0;i<3;i++)
11 for(int j=0;j<3;j++)
12 a[i][j]=(i==j);
13 }
14 Matrix operator * (const Matrix &B)const
15 {
16 Matrix C;
17 for(int i=0;i<3;i++)
18 for(int j=0;j<3;j++)
19 for(int k=0;k<3;k++)
20 C.a[i][j]=(C.a[i][j]+1LL*a[i][k]*B.a[k][j])%Mod;
21 return C;
22 }
23 Matrix operator ^ (const ll &p)const
24 {
25 Matrix A=(*this),res;
26 res.init();
27 ll t=p;
28 while(t)
29 {
30 if(t&1)res=res*A;
31 A=A*A;
32 t>>=1;
33 }
34 return res;
35 }
36 }M[8];