#include <stdio.h>
#include <math.h>

const int N = 5;
double a[ N ][ N ];
double b[ N ][ N ];

void fill_a() {
	for ( int i = 0; i < N; i++ ) {
		for ( int j = 0; j < N; j++ ) {
			a[ i ][ j ] = sin( ( i + 1 ) + 2 * ( j + 1 ) );
		}
	}
}

void smooth() {
	for ( int i = 1; i < N - 1; i++ ) {
		for ( int j = 1; j < N - 1; j++ ) {
			b[ i ][ j ] = 0;
	        for ( int ii = i - 1; ii < i + 1; ii++ ) {
		        for ( int jj = j - 1; jj < j + 1; jj++ ) {
		        	b[ i ][ j ] += a[ ii ][ jj ];
		        }
	        }
	        b[ i ][ j ] /= 9;
		}
	}
	for ( int i = 0; i < N; i++ ) {
		b[ i ][ 0 ] = a[ i ][ 0 ];
		b[ i ][ N - 1 ] = a[ i ][ N - 1 ];
		b[ 0 ][ i ] = a[ 0 ][ i ];
		b[ N - 1 ][ i ] = a[ N - 1 ][ i ];
	}
}

int max_element_column() {
    double max_elem = -2.0;
    int max_column = 0;
	for ( int i = 0; i < N; i++ ) {
		for ( int j = 0; j < N; j++ ) {
			if ( b[ i ][ j ] > max_elem ) {
				max_elem = b[ i ][ j ];
				max_column = j;
			}
		}
	}
	return max_column;
}

double count_g( int column ) {
    double g = 1.0;
	for ( int i = 0; i < N - 1; i++ ) {
		g *= b[ i ][ column ] * b[ i + 1 ][ column ];
	}
	return g;
}

void print_matrix( double (&m)[ N ][ N ] ) {
	for ( int i = 0; i < N; i++ ) {
		for ( int j = 0; j < N; j++ ) {
			printf( "%.2f ", m[ i ][ j ] );
		}
		printf( "\n" );
	}
}

void print_x( int column ) {
    for ( int i = 0; i < N; i++ ) {
		printf( "%.2f ", b[ i ][ column ] );
    }	
	printf( "\n" );
}

int main() {
	fill_a();
	smooth();
	int max_column = max_element_column();
	double u = count_g( max_column );
	printf( "A:\n" );
	print_matrix( a );
	printf( "-----------\n" );
	printf( "B:\n" );
	print_matrix( b );
	printf( "-----------\n" );
	printf( "x = " );
	print_x( max_column );
	printf( "u = %f\n", u );
	return 0;
}