矩阵加速
模板
#include <cstdio>
const int MAXRC = 3;
const int MAXR = MAXRC, MAXC = MAXRC;
const int ori[MAXR][MAXC] =
{
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
}, ori_R = 1, ori_C = MAXC - 1;
const int acc[MAXR][MAXC] =
{
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
}, acc_R = MAXR - 1, acc_C = MAXC - 1;
struct Matrix
{
int Mat[MAXR][MAXC];
int R, C, RC;
Matrix ()
{
for (int i = 0; i <= MAXR - 1; i++)
for (int j = 0; j <= MAXC - 1; j++)
Mat[i][j] = 0;
}
void Read_Mat() const
{
for (int i = 1; i <= R; i++)
for (int j = 1; j <= C; j++)
scanf("%d", &Mat[i][j]);
}
void Write_Mat() const
{
if (R < 1 || C < 1) return ;
for (int i = 1; i <= R; i++)
{
for (int j = 1; j < C; j++)
printf("%d ", Mat[i][j]);
printf("%d\n", Mat[i][C]);
}
}
Matrix operator * (const Matrix mat) const
{
Matrix res;
res.R = R, res.C = mat.C;
for (int i = 1; i <= res.R; i++)
for (int j = 1; j <= res.C; j++)
for (int k = 1; k <= mat.R; k++)
res.Mat[i][j] += Mat[i][k] * mat.Mat[k][j];
return res;
}
}Ori, Acc;
Matrix Pow_Matrix(Matrix mat, int k)
{
Matrix res, cnt = mat;
res.R = res.C = res.RC = MAXRC - 1;
for (int i = 1; i <= res.RC; i++)
res.Mat[i][i] = 1;
while (k > 0)
{
if (k & 1) res = res * cnt;
cnt = cnt * cnt;
k >>= 1;
}
return res;
}
void Init_Matrix()
{
Ori.R = ori_R, Ori.C = ori_C;
for (int i = 1; i <= ori_R; i++)
for (int j = 1; j <= ori_C; j++)
Ori.Mat[i][j] = ori[i][j];
Acc.R = acc_R, Acc.C = acc_C;
for (int i = 1; i <= acc_R; i++)
for (int j = 1; j <= acc_C; j++)
Acc.Mat[i][j] = acc[i][j];
}
void Read(int &n)
{
n = 0;
bool f = 1;
char C = getchar();
while (C < '0' || C > '9')
{
if (C == '-') f ^= 1;
C = getchar();
}
while ('0' <= C && C <= '9')
{
n = (n << 3) + (n << 1) + (C ^ 48);
C = getchar();
}
if (!f) n = -n;
}
int main()
{
Init_Matrix();
return 0;
}