矩陣消元模板

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());
			}
		}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章