矩阵快速幂
const int maxn = 3;
struct Mat
{
int a[maxn][maxn];
};
Mat A, B, C, D;
int n, m;
Mat get(Mat x, Mat y)
{
Mat z;
memset(z.a, 0, sizeof(z.a));
for(int i = 1; i <= 2; i++)
for(int j = 1; j <= 2; j++)
for(int k = 1; k <= 2; k++)
{
z.a[i][j] += x.a[i][k]*y.a[k][j];
z.a[i][j] %= mod;
}
return z;
}
void Mat_pow(int n)
{
if(n <= 0)
return;
while(n)
{
if(n&1)
B = get(A, B);
A = get(A, A);
n >>= 1;
}
}