设矩阵为n*n(n<N)的矩阵,代码如下:
const int N = 100;
void matmul(long long a[][N], long long b[][N], long long n)
{
long long temp[N][N];
memset(temp, 0, sizeof(temp));
for (long long i = 1; i <= n; i++)
for (long long j = 1; j <= n; j++)
for (long long k = 1; k <= n; k++)
temp[i][j] += a[i][k] * b[k][j];
for (long long i = 1; i <= n; i++)
for (long long j = 1; j <= n; j++)
a[i][j] = temp[i][j];
}
void quick_pow(long long a[][N], long long n)
{
long long ans[N][N];
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
ans[i][j] = 1;
while (n != 0)
{
if (n & 1)matmul(ans, a, N);
n /= 2;
matmul(a, a, N);
}
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
a[i][j] = ans[i][j];
return;
}