https://vjudge.net/problem/SPOJ-DETER3
純矩陣消元, 取模注意
import java.io.BufferedInputStream;
import java.util.Scanner;
public class sopjdeter3_矩陣消元 {
static long[][] c,temp;
static long n,m,k;
static long matrix_tree() {
long res=1;
int flag=1;
for(int i=1;i<=n;i++) {
if(c[i][i]==0){
int flag2=0;
for(int j=i+1;j<=n;j++) {
if(c[j][i]!=0) {
flag2=1;
for(int k=i;k<=n;k++) {
long t =c[i][k]; c[i][k]=c[j][k];c[j][k]=t;
}
flag*=-1;
break;
}
}
if(flag2==0) return 0;
}
for(int j=i+1;j<=n;j++) {
while(c[j][i]!=0) {
long a=c[i][i]/c[j][i];
for(int k=i;k<=n;k++) {
c[i][k]=(c[i][k]-a*c[j][k])%m;
long t =c[i][k]; c[i][k]=c[j][k];c[j][k]=t;
}
flag*=-1;
}
}
}
res=res*flag;
for(int i=1;i<=n;i++) {
res*=c[i][i];
res%=m;
}
return ((res+m)%m);
}
public static void main(String[] args) {
Scanner sc= new Scanner(new BufferedInputStream(System.in));
c=new long[400][400];
while(sc.hasNext()) {
n =sc.nextInt();
m=sc.nextInt();
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
c[i][j]=sc.nextLong();
c[i][j]%=m;
}
}
System.out.println(matrix_tree());
}
}
}