矩阵行列式计算
要求矩阵行列式,需要通过初等变换使得矩阵变为三角矩阵,然后对角线元素之积就是矩阵行列式的值。但是一般的初等变换可能导致浮点数的产生从而影响精度。因此这里使用辗转相除法进行初等变换。
本算法是将其转化为上三角矩阵。因此从第一行开始,处理第 i行 时,要将第
对于第
/zhoufenqin/article/details/7779707
本题多了个取模的部分。。。
#include<bits/stdc++.h>using namespace std;typedef long long ll;int n;ll mod;ll a[207][207];ll getRet(){ll ret=1;for(int i=0;i<n;i++){if(a[i][i]<0){ret=-ret;for(int k=i;k<n;k++) a[i][k]=-a[i][k];}for(int j=i+1;j<n;j++){for(int k=i;k<n;k++) a[i][k]%=mod,a[j][k]%=mod;while(a[j][i]){if(a[j][i]<0){ret=-ret;for(int k=i;k<n;k++) a[j][k]=-a[j][k];}ll t=a[i][i]/a[j][i];for(int k=i;k<n;k++) a[i][k]=(a[i][k]-t*a[j][k])%mod;for(int k=i;k<n;k++) swap(a[i][k],a[j][k]);ret=-ret;}}if(a[i][i]==0) return 0;ret=ret*a[i][i]%mod;}return (ret+mod)%mod;}int main(){ios::sync_with_stdio(false);cin.tie(0);while(cin>>n>>mod){for(int i=0;i<n;i++)for(int j=0;j<n;j++) cin>>a[i][j];cout<<getRet()<<endl;}return 0;}