矩陣求逆

zhuangzhongxu發表於2024-11-09

有小數版


#include<stdio.h>
const int N=110;
double mat[N][N*2];
double a[N][N],b[N][N],c[N][N];
int n;



void mul(int k,double x){
	for(int i=1;i<=n*2;i++){
		mat[k][i]*=x;
	}
}

void add(int k,int u,double x){
	for(int i=1;i<=n*2;i++){
		mat[k][i]+=mat[u][i]*x;
	}
}

double calc(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int u=1;u<=n;u++){
				c[i][j]+=a[i][u]*b[u][j];
			}
		}
	}
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		mat[i][n+i]=1; 
		for(int j=1;j<=n;j++){
			scanf("%lf",&a[i][j]);
			mat[i][j]=a[i][j];
		}
	} 

//	for(int i=1;i<=n;i++){
//		for(int j=1;j<=n*2;j++){
//			printf("%lf ",mat[i][j]);
//		}
//		putchar('\n');
//	} 
	
	for(int i=1;i<=n;i++){
		mul(i,1/mat[i][i]);
		for(int j=i+1;j<=n;j++){
			add(j,i,-mat[j][i]);
		}
	}
	
	for(int i=n;i>1;i--){
		for(int j=i-1;j>=1;j--){
			add(j,i,-mat[j][i]);
		}
	}
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			b[i][j]=mat[i][j+n];
		}
	}
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n*2;j++){
			printf("%lf ",mat[i][j]);
		}
		putchar('\n');
	} 
	
	
	calc();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			printf("%lf ",c[i][j]);
		}
		putchar('\n');
	} 
	
	
	return 0;
}

無小數版


#include<stdio.h>
const int N=110,MOD=1e9+7;
typedef long long LL; 
LL mat[N][N*2];
LL a[N][N],b[N][N],c[N][N];
int n;

LL qmi(LL x,LL y){
	LL res=1;
	while(y){
		if(y&1) res=res*x%MOD;
		x=x*x%MOD;
		y>>=1;
	}
	return res;
}

void mul(int k,LL x){
	for(int i=1;i<=n*2;i++){
		mat[k][i]=(mat[k][i]*x%MOD+MOD)%MOD;
	}
}

void add(int k,int u,LL x){
	for(int i=1;i<=n*2;i++){
		mat[k][i]=((mat[k][i]+mat[u][i]*x)%MOD+MOD)%MOD;
	}
}

void calc(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int u=1;u<=n;u++){
				c[i][j]=((c[i][j]+a[i][u]*b[u][j])%MOD+MOD)%MOD;
			}
		}
	}
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		mat[i][n+i]=1; 
		for(int j=1;j<=n;j++){
			scanf("%lld",&a[i][j]);
			mat[i][j]=a[i][j];
		}
	} 

	for(int i=1;i<=n;i++){
		for(int j=1;j<=n*2;j++){
			printf("%lld ",mat[i][j]);
		}
		putchar('\n');
	} 
	
	for(int i=1;i<=n;i++){
		mul(i,qmi(mat[i][i],MOD-2));
		for(int j=i+1;j<=n;j++){
			add(j,i,-mat[j][i]);
		}
	}
	
		for(int i=1;i<=n;i++){
		for(int j=1;j<=n*2;j++){
			printf("%lld ",mat[i][j]);
		}
		putchar('\n');
	} 
	
	for(int i=n;i>1;i--){
		for(int j=i-1;j>=1;j--){
			add(j,i,-mat[j][i]);
		}
	}
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			b[i][j]=mat[i][j+n];
		}
	}
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n*2;j++){
			printf("%lld ",mat[i][j]);
		}
		putchar('\n');
	} 
	
	
	calc();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			printf("%lld ",c[i][j]);
		}
		putchar('\n');
	} 
	
	
	return 0;
}

相關文章