矩阵快速幂
矩阵快速幂
1、模版题:洛谷P3390。
template<typename T>
struct mat{
static const int MAX = 105;
T m[MAX][MAX];
mat() {
memset(m, 0, sizeof m);
}
inline void init() {
//构造单位矩阵
//单位矩阵,它从左上角到右下角的对角线上的元素均为1,除此以外全都为0。
//它在矩阵乘中相当于数乘中的1,即任何矩阵乘它都等于本身。
for (int i = 0; i < MAX; i++) {
m[i][i] = 1;
}
}
inline mat operator+ (mat &B) const {
mat<T> res;
for (int i = 0; i < MAX; i++) {
for (int j = 0; j < MAX; j++) {
res.m[i][j] = (m[i][j] + B.m[i][j]) % mod;
res.m[i][j] = (res.m[i][j] + mod) % mod;
}
}
return res;
}
inline mat operator- (mat &B) const {
mat<T> res;
for (int i = 0; i < MAX; i++) {
for (int j = 0; j < MAX; j++) {
res.m[i][j] = (m[i][j] - B.m[i][j]) % mod;
res.m[i][j] = (res.m[i][j] + mod) % mod;
}
}
return res;
}
inline mat operator* (mat &B) const {
mat<T> res;
for (int i = 0; i < MAX; i++) {
for (int j = 0; j < MAX; j++) {
for (int k = 0; k < MAX; k++) {
res.m[i][j] = (res.m[i][j] + m[i][k] * B.m[k][j]) % mod;
res.m[i][j] = (res.m[i][j] + mod) % mod;
}
}
}
return res;
}
inline mat operator^ (T b) const {
mat<T> res, A = *(this);
res.init();
while (b) {
if (b & 1) res = res * A;
A = A * A;
b >>= 1;
}
return res;
}
};

浙公网安备 33010602011771号