垃圾vector nmsl
struct mat
{
static const int md=1e9+7;
ll a[4][4];
mat()
{
memset(a,0,sizeof(a));
}
mat(int x)
{
memset(a,0,sizeof(a));
a[0][0]=a[1][1]=a[2][2]=a[3][3]=1;
}
ll* operator[](int x)
{
return a[x];
}
mat operator+(mat r)
{
mat res;
for (int i=0; i<4; ++i)
{
for (int j=0; j<4; ++j)
{
res[i][j]=(a[i][j]+r[i][j])%md;
}
}
return res;
}
mat operator-(mat r)
{
mat res;
for (int i=0; i<4; ++i)
{
for (int j=0; j<4; ++j)
{
res[i][j]=(a[i][j]-r[i][j]+md)%md;
}
}
return res;
}
mat operator*(mat r)
{
mat res;
for(int i=0; i<4; i++)
for(int j=i; j<4; j++)
for(int k=i; k<=j; k++)
res[i][j]=add((res[i][j]+ a[i][k]*r[k][j] )%md,md);
return res;
}
};