boolcmp(vector<int> A, vector<int> B){ //比较两个高精度数字的大小 if (A.size() != B.size()) return A.size() > B.size(); for (int i = A.size() - 1; i >= 0; i--) { if (A[i] != B[i]) return A[i] > B[i]; } returntrue; }
vector<int> sub(vector<int> A, vector<int> B){ //减法模板,具体看上文 vector<int> C; int t = 0; for (int i = 0; i < A.size(); i++) { t = A[i] - t; if (i < B.size()) t -= B[i]; C.push_back((t + 10) % 10); if (t < 0) t = 1; else t = 0; } while (C.size() > 1 && C.back() == 0) C.pop_back(); return C; }
vector<int> div(vector<int> A, vector<int> B, vector<int> &R){ //A=被减数 B=减数 R=余数 vector<int> C; //初始化答案向量 R.clear(); R.push_back(0); // 从最高位开始,逐位试商 for (int i = A.size() - 1; i >= 0; i--) { R.insert(R.begin(), A[i]); while (R.size() > 1 && R.back() == 0) R.pop_back(); // 去前导0 int q = 0; while (cmp(R, B)) { R = sub(R, B); q++; } C.push_back(q); } reverse(C.begin(), C.end()); // 答案现在是高位在前,翻转成低位在前 while (C.size() > 1 && C.back() == 0) C.pop_back(); // 去前导0 return C; }
完成
xxxxxxxxxx #include <bits/stdc++.h>using namespace std;const int N = 101, M = 1e9+7;int n;long long k;struct mat { int c[N][N]; mat operator* (const mat a) const { mat res; for(int i = 0;i < N;i++) { for(int j = 0;j < N;j++) { for(int l = 0;l < N;l++) { res.c[i][j] = (res.c[i][j] + 1LL * c[i][l] * a.c[l][j]) % M; } } } return res; } mat() {memset(c, 0, sizeof(c));}} ans, a;void quick(long long k) { while(k) { if(k&1) ans = ans * a; a = a * a; k >>= 1; }}signed main(){ cin >> n >> k; for(int i = 0;i < n;i++) ans.c[i][i] = 1; for(int i = 0;i < n;i++) for(int j = 0;j < n;j++) cin >> a.c[i][j]; quick(k); for(int i = 0;i < n;i++) { for(int j = 0;j < n;j++) cout << ans.c[i][j] << " "; cout << endl; } return 0;}cpp