#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mx = 2;
struct Matrix {
ll v[5][5];
void init() {
for(ll i = 0; i < 5; i++)
for(ll j = 0 ; j < 5; j++)
v[i][j] = 0; //初始化矩阵
}
};
void read(Matrix &a) {
for(ll i = 1; i <= mx; i++)
for(ll j = 1; j <= mx; j++)
cin >> a.v[i][j];
}
void print(Matrix a, ll mx) {
for(ll i = 1; i <= mx; i++) {
for(ll j = 1; j <= mx; j++)
cin >> a.v[i][j];
cout << '\n';
}
}
Matrix add(Matrix a, Matrix b, ll mx) { //矩阵加法
Matrix ans; ans.init();
for(ll i = 1; i <= mx; i++)
for(ll j = 1; j <= mx; j++)
ans.v[i][j] = a.v[i][j] + b.v[i][j];
return ans;
}
Matrix mul(Matrix a, Matrix b, ll mx) { //矩阵乘法
Matrix ans; ans.init();
for(ll i = 1; i <= mx; i++) {
for(ll j = 1; j <= mx; j++) {
ll s = 0;
for(ll k = 1; k <= mx; k++) s += a.v[i][k] * b.v[k][j];
ans.v[i][j] = s;
}
}
return ans;
}
Matrix operator + (Matrix a, Matrix b) { //重载加法——两个矩阵相加
Matrix ans; ans.init();
for(ll i = 1; i <= mx; i++)
for(ll j = 1; j <= mx; j++)
ans.v[i][j] = a.v[i][j] + b.v[i][j];
return ans;
}
Matrix operator + (Matrix a, ll x) { //重载加法——矩阵加数
Matrix ans; ans.init();
for(ll i = 1; i <= mx; i++)
for(ll j = 1; j <= mx; j++)
ans.v[i][j] = a.v[i][j] + x;
return ans;
}
Matrix operator * (Matrix a, Matrix b) { //矩阵乘法
Matrix ans; ans.init();
for(ll i = 1; i <= mx; i++) {
for(ll j = 1; j <= mx; j++) {
ll s = 0;
for(ll k = 1; k <= mx; k++) s += a.v[i][k] * b.v[k][j];
ans.v[i][j] = s;
}
}
return ans;
}
istream& operator >> (istream &is, Matrix &a) { //重载读入
for(ll i = 1; i <= mx; i++)
for(ll j = 1; j <= mx; j++)
is >> a.v[i][j];
return is;
}
ostream& operator << (ostream &os, Matrix a) { //重载输出
for(ll i = 1; i <= mx; i++) {
for(ll j = 1; j <= mx; j++)
os << a.v[i][j] << " ";
os << '\n';
}
return os;
}
Matrix& operator += (Matrix &a, Matrix b) {
a = a + b;
return a;
}
Matrix mpow(Matrix m, ll n) { //矩阵快速幂
Matrix ans; ans.init();
for(ll i = 1; i <= 2; i++) ans.v[i][i] = 1; //初始化单位矩阵
do {
if(n & 1) ans = ans * m;
m = m * m; n >>= 1;
} while(n); //二进制快速幂
return ans;
}