题意:
给出一个矩阵,求它的逆矩阵。
算是模板了吧。
经典方法:
左边写原矩阵,右边写单位矩阵,然后把左边高斯消元成单位矩阵,右边就是逆元。
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 205;
int n, m, p, a[maxn][maxn];
inline int qpow(int x, int n) {
int ans = 1;
for(int t = x; n; n >>= 1, t = (t * t) % p) if(n & 1) ans = (ans * t) % p;
return ans;
}
bool gauss() {
for(int i = 1; i <= n; i++) {
int j;
for(j = i; j <= n && !a[j][i]; j++);
if(j > n) return 0;
for(int k = 1; k <= m; k++) swap(a[j][k], a[i][k]);
int t = qpow(a[i][i], p - 2);
for(int k = 1; k <= m; k++) a[i][k]= (a[i][k] * t) % p;
for(j = 1; j <= n; j++) if(j != i && a[j][i] != 0) {
int t = qpow(a[j][i], p - 2);
for(int k = 1; k <= m; k++) a[j][k] = (a[j][k] * t - a[i][k] + p) % p;
}
}
for(int i = 1; i <= n; i++) {
int t = qpow(a[i][i], p - 2);
for (int k = 1 ; k <= m ; k++) a[i][k] = (a[i][k] * t) % p;
}
return 1;
}
int main() {
while(1) {
scanf("%d%d", &n, &p);
if(n == 0 && p == 0) break;
for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) scanf("%d", &a[i][j]);
m = n << 1;
for(int i = 1; i <= n; i++) for(int j = n + 1; j <= m; j++) a[i][j] = (i + n == j);
if(gauss()) {
for(int i = 1; i <= n; i++) {
for(int j = n + 1; j <= m; j++) printf("%d ", a[i][j]);
printf("\n");
}
} else printf("singular\n");
}
return 0;
}