P3390
【模板】矩阵快速幂 - 洛谷 计算机科学教育新生态
题目大意
给定 \(n \times n\) 的矩阵 \(A\) ,求 \(A^k\) 。
其中 \(1 \leqslant n \leqslant 100\)
, \(0 \leqslant k \leqslant 10^{12}\) ,
\(\left| A_{i, j} \right| \leqslant
1000\) 。
算法选择
矩阵快速幂算法模板,具体见下。
算法 矩阵快速幂 |
散虑の春雨寻风
代码实现
注意开 long long
。
时间复杂度 \(O(n^3\log k)\) , 用时
639ms 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| #include <cstdio> #include <iostream> #include <cmath> #include <cstdlib> #include <algorithm> #include <cstring>
using namespace std;
const long long MOD = 1000000007; const int NMAX = 105;
struct matrix { long long val[NMAX][NMAX];
matrix(); matrix operator*(const matrix &); };
long long n, k;
matrix::matrix() { memset(val, 0, sizeof(val)); }
matrix matrix::operator*(const matrix &mat) { matrix res; for (register int i = 0; i < n; i++) for (register int j = 0; j < n; j++) for (register int k = 0; k < n; k++) res.val[i][j] = (res.val[i][j] + this->val[i][k] * mat.val[k][j]) % MOD; return res; }
template<typename T> T ksm(T a, long long x) { T ans = a; x--; for (; x; x >>= 1) { if (x & 1) ans = ans * a; a = a * a; } return ans; }
int main() { cin >> n >> k;
matrix mat; for (register int i = 0; i < n; i++) for (register int j = 0; j < n; j++) scanf("%lld", &mat.val[i][j]);
mat = ksm(mat, k);
for (register int i = 0; i < n; i++) { for (register int j = 0; j < n; j++) printf("%lld ", mat.val[i][j]); putchar(10); }
system("pause"); return 0; }
|
2020-9-10 Update: 更正 ksm() 函数。