P7112 【模板】行列式求值 题解(高斯消元+辗转相除)
题目链接
题目思路
先介绍行列式的变化对于行列式值的改变
1 如果交换矩阵的两行,则行列式的符号要取反
2 如果用某数t乘以矩阵的一行,则行列式等于原行列式的t倍
3 三角阵的行列式等于对角线元素乘积
4 从矩阵的行k减去行i的l倍,行列式不会改变,即消元过程不改变行列式
根据上面的式子用高斯消元化简即可
注意这里不需要求逆元,由于行列的相互加减不会影响行列式的值
所以使用辗转相除法
代码
#include
#define fi first
#define se second
#define debug cout<<"I AM HERE"<a[j][i]){
swap(a[i],a[j]);
flag^=1;
}
while(a[j][i]){
swap(a[i],a[j]);
flag^=1;
ll p=a[j][i]/a[i][i];
for(int k=i;k<=n;k++){
a[j][k]=(a[j][k]+(mod-p)*a[i][k])%mod;
}
}
}
ans=ans*a[i][i]%mod;
}
if(!flag){
ans=(-ans+mod)%mod;
}
return ans;
}
signed main(){
scanf("%d%d",&n,&mod);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%lld",&a[i][j]);
}
}
ll ans=gs(n);
printf("%lld\n",ans);
return 0;
}