这东西坑人……
整数
一般会要求取模,而且模数不一定是质数。
void Dswap(int N,int p,int q){
rep(i,1,N)swap(a[p][i],a[q][i]);
}
void deter(int N){
bool fu=0;
rep(i,1,N){
int wei=i;bool flag=0;
rep(j,i,N){
if(a[j][i]&&!flag)flag=1;
if(a[j][i]&&a[j][i]<a[wei][i])wei=j;
}
if(!flag){ans=0;return;}
if(i!=wei)Dswap(N,i,wei),fu=1-fu;
rep(j,i+1,N){
if(a[j][i]>a[i][i]){Dswap(N,i,j);fu=1-fu;}
while(a[j][i]){
lon tmp=a[i][i]/a[j][i];
rep(k,i,N)a[i][k]=(a[i][k]+(mo-tmp)*a[j][k])%mo;
Dswap(N,i,j);
fu=1-fu;
}
}
ans=ans*a[i][i]%mo;
}
if(fu)ans=(-ans+mo)%mo;
}
常数小,但是不能处理模数不是质数的情况:(有锅待修,先别用!!)
void Dswap(int N,int p,int q){
rep(i,1,N)swap(a[p][i],a[q][i]);
}
void deter(int N){
bool fu=0;
rep(i,1,n){
rep(j,i+1,n)while(a[j][i]){
lon tmp=a[i][i]/a[j][i];
rep(k,i,n)a[i][k]=(a[i][k]-tmp*a[j][k]%mo+mo)%mo;
Dswap(N,i,j);
fu=1-fu;
}
ans=(ans*a[i][i]%mo+mo)%mo;
}
if(fu)ans=(-ans+mo)%mo;
}
小数
注意精度,所以判断 0 的方式是 fabs(a)>eps
而不是 a==0
。(eps=1e-15)
void Dswap(int N,int p,int q){
rep(i,1,N)swap(a[p][i],a[q][i]);
}
void deter(int N){
bool fu=0;
rep(i,1,N){
int wei=i;
rep(j,i,N)if(zro(a[j][i])){wei=j;break;}
if(i!=wei)Dswap(N,i,wei),fu=1-fu;
rep(j,i+1,N){
while(zro(a[j][i])&&zro(a[i][i])){
if(a[j][i]>a[i][i]){Dswap(N,i,j);fu=1-fu;}
lod tmp=a[j][i]/a[i][i];
rep(k,i,N)a[j][k]=a[j][k]-tmp*a[i][k];
}
if(!zro(a[i][i]))Dswap(N,i,j),fu=1-fu;
}
ans=ans*a[i][i];
}
if(fu)ans=-ans;
}