南郵OJ 1340逆行列問題


ぎゃくマトリクスもんだい
時間制限(通常/Java) : 
1000 MS/ 3000 MS          実行メモリ制限:65536 KByte合計コミット:51           テストに合格しました:24 
試合の説明
 
与えられた2 個n×nマトリクスa bと、判定aを設計してみる およびb 相互逆のモンテカルロアルゴリズムかどうかは,アルゴリズムの計算時間はO(n 2)であるべきである.与えられた行列aとbに対して,それらが互いに逆であるか否かを判定するモンテカルロアルゴリズムを設計した.
入力
 
入力された最初の行には正の整数nが1つあり、マトリクスaとbを表す n×n行列.次の2 n行は、各行にn個の実数があり、マトリクスaとbをそれぞれ表す に表示されます.
しゅつりょく
マトリックスa およびb 互いに逆ならYES、そうでなければNOを出力する.
サンプル入力
3 1 2 3 2 2 3 3 3 3 -1 1 0 1 -2 1 0 1 -0.666667
サンプル出力
YES
ヒント
 
テーマソース
アルゴリズム設計と実験問題解
#include<iostream>
#define MAX_N 100
#define LIMIT (1e-3)
double a[MAX_N][MAX_N];
double b[MAX_N][MAX_N];

bool equal(double a, double b){
	a -= b;
	if( a<LIMIT && a>-LIMIT){
		return 1;
	}else{
		return 0;
	}
}

int main(){
	freopen("test.txt","r",stdin);
	int n,i,j,k;
	double temp;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			scanf("%lf",&a[i][j]);
		}
	}
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			scanf("%lf",&b[i][j]);
		}
	}
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			temp = 0;
			for(k=0;k<n;k++){
				temp += a[i][k]*b[k][j];
			}
			if(i==j && !equal(temp,1) ||
				i!=j && !equal(temp,0)){
				printf("NO
"); return 0; } } } printf("YES
"); }