#include<stdio.h>
#include<stdlib.h>

int main(){
	int seed,A[100][100],a=1,b=1,k;
	scanf("%d",&seed);
	srand(seed);
    for(b=1;b<5;b++){
	  for(a=1;a<5;a++)
	  {A[a][b]=rand()%100-rand()%100;}
	}
	printf("The 4x4 matrix is:\n");
	for(a=1;a<5;a++){
		for(b=1;b<5;b++)
		{   if(0<=A[a][b]<=9){printf("%3d  ",A[a][b]);}
		else {printf("%3d  ",A[a][b]); }   }
		printf("\n");
	}
	printf("\n\n");
	
	for(a=1;a<4;a++){
	 for(b=2;b<5;b++){
	   if(a==2&&b==2){b++;}
	   if(a==3&&b==2){b++;}
	 k=A[a][b];
	 A[a][b]=A[b][a];
	 A[b][a]=k;
	}
   }
	printf("The transpose matrix is:\n");
	for(a=1;a<5;a++){
		for(b=1;b<5;b++)
		{   if(0<=A[a][b]<=9){printf("%3d  ",A[a][b]);}
		else {printf("%3d  ",A[a][b]); }   }
		printf("\n");
	}
	
	printf("\n\n");

	for(a=1;a<4;a++){
	 for(b=2;b<5;b++){
	   if(a==2&&b==2){b++;}
	   if(a==3&&b==2){b++;}
	 k=A[a][b];
	 A[a][b]=A[b][a];
	 A[b][a]=k;
	}
   }

	int condition=1,n=0;
	float B[100][100],m[100],det,inversematrix[100];
	for(b=1;b<5;b++){
	  for(a=1;a<5;a++)
	  {B[a][b]=A[a][b];}
	}
	a=1;b=1;n=0;
	for(a=1;a<5;a++){
		for(b=1;b<5;b++){m[n]=B[a][b];
		if(b<4){n++;}
		}
	}
	 det=m[0]*m[5]*m[10]*m[15]+m[0]*m[6]*m[11]*m[13]+m[0]*m[7]*m[9]*m[14]
          +m[1]*m[4]*m[11]*m[14]+m[1]*m[6]*m[8]*m[15]+m[1]*m[7]*m[10]*m[12]
          +m[2]*m[4]*m[9]*m[15]+m[2]*m[5]*m[11]*m[12]+m[2]*m[7]*m[8]*m[13]
          +m[3]*m[4]*m[10]*m[13]+m[3]*m[5]*m[8]*m[14]+m[3]*m[6]*m[9]*m[12]
          -m[0]*m[5]*m[11]*m[14]-m[0]*m[6]*m[9]*m[15]-m[0]*m[7]*m[10]*m[13]
          -m[1]*m[4]*m[10]*m[15]-m[1]*m[6]*m[11]*m[12]-m[1]*m[7]*m[8]*m[14]
          -m[2]*m[4]*m[11]*m[13]-m[2]*m[5]*m[8]*m[15]-m[2]*m[7]*m[9]*m[12]
          -m[3]*m[4]*m[9]*m[14]-m[3]*m[5]*m[10]*m[12]-m[3]*m[6]*m[8]*m[13];
	   
		
		  if(det==0){condition=0;}
    if(condition){
		float invdet;
        invdet = 1/det;
        inversematrix[0]  = invdet*(m[5]*m[10]*m[15]+m[6]*m[11]*m[13]+m[7]*m[9]*m[14]-m[5]*m[11]*m[14]-m[6]*m[9]*m[15]-m[7]*m[10]*m[13]);
        inversematrix[1]  = invdet*(m[1]*m[11]*m[14]+m[2]*m[9]*m[15]+m[3]*m[10]*m[13]-m[1]*m[10]*m[15]-m[2]*m[11]*m[13]-m[3]*m[9]*m[14]);
        inversematrix[2]  = invdet*(m[1]*m[6]*m[15]+m[2]*m[7]*m[13]+m[3]*m[5]*m[14]-m[1]*m[7]*m[14]-m[2]*m[5]*m[15]-m[3]*m[6]*m[13]);
        inversematrix[3]  = invdet*(m[1]*m[7]*m[10]+m[2]*m[5]*m[11]+m[3]*m[6]*m[9]-m[1]*m[6]*m[11]-m[2]*m[7]*m[9]-m[3]*m[5]*m[10]);
 
        inversematrix[4]  = invdet*(m[4]*m[11]*m[14]+m[6]*m[8]*m[15]+m[7]*m[10]*m[12]-m[4]*m[10]*m[15]-m[6]*m[11]*m[12]-m[7]*m[8]*m[14]);
        inversematrix[5]  = invdet*(m[0]*m[10]*m[15]+m[2]*m[11]*m[12]+m[3]*m[8]*m[14]-m[0]*m[11]*m[14]-m[2]*m[8]*m[15]-m[3]*m[10]*m[12]);
        inversematrix[6]  = invdet*(m[0]*m[7]*m[14]+m[2]*m[4]*m[15]+m[3]*m[6]*m[12]-m[0]*m[6]*m[15]-m[2]*m[7]*m[12]-m[3]*m[4]*m[14]);
        inversematrix[7]  = invdet*(m[0]*m[6]*m[11]+m[2]*m[7]*m[8]+m[3]*m[4]*m[10]-m[0]*m[7]*m[10]-m[2]*m[4]*m[11]-m[3]*m[6]*m[8]);
 
        inversematrix[8]  = invdet*(m[4]*m[9]*m[15]+m[5]*m[11]*m[12]+m[7]*m[8]*m[13]-m[4]*m[11]*m[13]-m[5]*m[8]*m[15]-m[7]*m[9]*m[12]);
        inversematrix[9]  = invdet*(m[0]*m[11]*m[13]+m[1]*m[8]*m[15]+m[3]*m[9]*m[12]-m[0]*m[9]*m[15]-m[1]*m[11]*m[12]-m[3]*m[8]*m[13]);
        inversematrix[10] = invdet*(m[0]*m[5]*m[15]+m[1]*m[7]*m[12]+m[3]*m[4]*m[13]-m[0]*m[7]*m[13]-m[1]*m[4]*m[15]-m[3]*m[5]*m[12]);
        inversematrix[11] = invdet*(m[0]*m[7]*m[9]+m[1]*m[4]*m[11]+m[3]*m[5]*m[8]-m[0]*m[5]*m[11]-m[1]*m[7]*m[8]-m[3]*m[4]*m[9]);
 
        inversematrix[12] = invdet*(m[4]*m[10]*m[13]+m[5]*m[8]*m[14]+m[6]*m[9]*m[12]-m[4]*m[9]*m[14]-m[5]*m[10]*m[12]-m[6]*m[8]*m[13]);
        inversematrix[13] = invdet*(m[0]*m[9]*m[14]+m[1]*m[10]*m[12]+m[2]*m[8]*m[13]-m[0]*m[10]*m[13]-m[1]*m[8]*m[14]-m[2]*m[9]*m[12]);
        inversematrix[14] = invdet*(m[0]*m[6]*m[13]+m[1]*m[4]*m[14]+m[2]*m[5]*m[12]-m[0]*m[5]*m[14]-m[1]*m[6]*m[12]-m[2]*m[4]*m[13]);
        inversematrix[15] = invdet*(m[0]*m[5]*m[10]+m[1]*m[6]*m[8]+m[2]*m[4]*m[9]-m[0]*m[6]*m[9]-m[1]*m[4]*m[10]-m[2]*m[5]*m[8]);
 
        n=0;a=1;b=1;
  for(a=1;a<5;a++){

		for(b=1;b<5;b++){B[a][b]=inversematrix[n];
		if(b<4){n++;}
		}
	}
  printf("The inverse matrix is:\n");
  for(a=1;a<5;a++){
		for(b=1;b<5;b++)
		{   if(0<=B[a][b]<=9){printf("%f  ",B[a][b]);}
		else {printf("%f  ",B[a][b]); }   }
		printf("\n");
	}

}
	else {printf("The inverse matrix isn't exist");}
	
	system("PAUSE");
	return 0;
}



