bzoj 2107 Spoj2832 Find The Determinant III

来源:互联网 发布:淘宝虚拟类目直通车 编辑:程序博客网 时间:2024/05/22 12:34

这题刚开始的第一想法是求每一个元素的逆元,然后直接化简行列式为上三角求行列式的值,但是不一定每个元素都与p互质。所以,这条路就基本走不通了。

后来看了题解,才发现原来可以用辗转相消的方法来消元求行列式。

伪代码:


代码:

#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define maxn 320using namespace std;int n;LL p;LL ans=1;LL deter[maxn][maxn];int main(){while (~scanf("%d%lld", &n, &p)){ans=1;for (int i=0;i<n;i++)for (int j=0;j<n;j++){scanf("%lld",&deter[i][j]);deter[i][j]=deter[i][j]%p;}for (int i=0;i<n;i++){if (!deter[i][i]){bool flag=0;for (int j=i+1;j<n;j++)if (deter[j][i]){flag=1;for (int k=i;k<n;k++)swap(deter[i][k],deter[j][k]);ans=-ans;break;}if (!flag){puts("0");return 0;}}for (int j=i+1;j<n;j++)while (deter[j][i]){LL t=deter[i][i]/deter[j][i];for (int k=i;k<n;k++){deter[i][k]=(deter[i][k]-t*deter[j][k])%p;swap(deter[j][k],deter[i][k]);}ans=-ans;}ans=ans*deter[i][i]%p;}ans=(ans+p)%p;printf("%lld\n",ans);}return 0;}



0 0
原创粉丝点击