【SPOJ-MIFF】Matrix inverse【高斯消元】

来源:互联网 发布:杨百万炒股软件 编辑:程序博客网 时间:2024/06/05 12:03

题意:

给出一个矩阵,求它的逆矩阵。


算是模板了吧。


经典方法:

左边写原矩阵,右边写单位矩阵,然后把左边高斯消元成单位矩阵,右边就是逆元。


#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;}


0 0
原创粉丝点击