#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
// Прототипы функций
int **allocate_matrix_dynamic(int rows, int cols);
void free_matrix_dynamic(int **matrix, int rows);
void read_matrix(int **matrix, int rows, int cols);
void print_matrix(int **matrix, int rows, int cols);
void add_matrices(int **A, int **B, int **C, int rows, int cols);
void multiply_matrices(int **A, int **B, int **C, int rowsA, int colsA, int colsB);
void transpose_matrix(int **A, int **B, int rows, int cols);
int main() {
int operation;
printf("Выберите операцию:\\n1 - Сложение матриц\\n2 - Умножение матриц\\n3 - Транспонирование матрицы\\n"); if (scanf("%d", &operation
) != 1 || operation
< 1 || operation
> 3) { return 1; // Ошибка выбора
}
if (operation == 1) {
// Сложение матриц
int rows, cols;
if (scanf("%d %d", &rows
, &cols
) != 2 || rows
< 1 || cols
< 1 || rows
> MAX_SIZE
|| cols
> MAX_SIZE
) { return 1; // Ошибка при считывании размеров матриц
}
int **A = allocate_matrix_dynamic(rows, cols);
int **B = allocate_matrix_dynamic(rows, cols);
int **C = allocate_matrix_dynamic(rows, cols);
if (A == NULL || B == NULL || C == NULL) {
return 1; // Ошибка при выделении памяти
}
read_matrix(A, rows, cols);
read_matrix(B, rows, cols);
add_matrices(A, B, C, rows, cols);
print_matrix(C, rows, cols);
free_matrix_dynamic(A, rows);
free_matrix_dynamic(B, rows);
free_matrix_dynamic(C, rows);
} else if (operation == 2) {
// Умножение матриц
int rowsA, colsA, rowsB, colsB;
if (scanf("%d %d", &rowsA
, &colsA
) != 2 || rowsA
< 1 || colsA
< 1 || rowsA
> MAX_SIZE
|| colsA
> MAX_SIZE
) { return 1; // Ошибка при считывании размеров первой матрицы
}
if (scanf("%d %d", &rowsB
, &colsB
) != 2 || rowsB
< 1 || colsB
< 1 || rowsB
> MAX_SIZE
|| colsB
> MAX_SIZE
) { return 1; // Ошибка при считывании размеров второй матрицы
}
if (colsA != rowsB) {
return 1; // Ошибка, если количество столбцов первой матрицы не совпадает с количеством строк второй
}
int **A = allocate_matrix_dynamic(rowsA, colsA);
int **B = allocate_matrix_dynamic(rowsB, colsB);
int **C = allocate_matrix_dynamic(rowsA, colsB);
if (A == NULL || B == NULL || C == NULL) {
return 1; // Ошибка при выделении памяти
}
read_matrix(A, rowsA, colsA);
read_matrix(B, rowsB, colsB);
multiply_matrices(A, B, C, rowsA, colsA, colsB);
print_matrix(C, rowsA, colsB);
free_matrix_dynamic(A, rowsA);
free_matrix_dynamic(B, rowsB);
free_matrix_dynamic(C, rowsA);
} else if (operation == 3) {
// Транспонирование матрицы
int rows, cols;
if (scanf("%d %d", &rows
, &cols
) != 2 || rows
< 1 || cols
< 1 || rows
> MAX_SIZE
|| cols
> MAX_SIZE
) { return 1; // Ошибка при считывании размеров матрицы
}
int **A = allocate_matrix_dynamic(rows, cols);
int **B = allocate_matrix_dynamic(cols, rows); // Транспонированная матрица
if (A == NULL || B == NULL) {
return 1; // Ошибка при выделении памяти
}
read_matrix(A, rows, cols);
transpose_matrix(A, B, rows, cols);
print_matrix(B, cols, rows);
free_matrix_dynamic(A, rows);
free_matrix_dynamic(B, cols);
}
return 0;
}
// Динамическое выделение: 2D массив
int **allocate_matrix_dynamic(int rows, int cols) {
int **matrix
= malloc(rows
* sizeof(int *)); if (matrix == NULL) return NULL;
for (int i = 0; i < rows; i++) {
matrix
[i
] = malloc(cols
* sizeof(int)); if (matrix[i] == NULL) {
for (int j = 0; j < i; j++) {
}
return NULL;
}
}
return matrix;
}
// Освобождение памяти для динамической матрицы
void free_matrix_dynamic(int **matrix, int rows) {
for (int i = 0; i < rows; i++) {
}
}
// Чтение матрицы
void read_matrix(int **matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (scanf("%d", &matrix
[i
][j
]) != 1) { exit(1); // Ошибка при считывании }
}
}
}
// Печать матрицы
void print_matrix(int **matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (j < cols - 1) {
}
}
if (i < rows - 1) {
}
}
}
// Сложение матриц
void add_matrices(int **A, int **B, int **C, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
C[i][j] = A[i][j] + B[i][j];
}
}
}
// Умножение матриц
void multiply_matrices(int **A, int **B, int **C, int rowsA, int colsA, int colsB) {
for (int i = 0; i < rowsA; i++) {
for (int j = 0; j < colsB; j++) {
C[i][j] = 0; // Инициализация элемента C
for (int k = 0; k < colsA; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
}
// Транспонирование матрицы
void transpose_matrix(int **A, int **B, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
B[j][i] = A[i][j];
}
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgTUFYX1NJWkUgMTAwCgovLyDQn9GA0L7RgtC+0YLQuNC/0Ysg0YTRg9C90LrRhtC40LkKaW50ICoqYWxsb2NhdGVfbWF0cml4X2R5bmFtaWMoaW50IHJvd3MsIGludCBjb2xzKTsKdm9pZCBmcmVlX21hdHJpeF9keW5hbWljKGludCAqKm1hdHJpeCwgaW50IHJvd3MpOwp2b2lkIHJlYWRfbWF0cml4KGludCAqKm1hdHJpeCwgaW50IHJvd3MsIGludCBjb2xzKTsKdm9pZCBwcmludF9tYXRyaXgoaW50ICoqbWF0cml4LCBpbnQgcm93cywgaW50IGNvbHMpOwp2b2lkIGFkZF9tYXRyaWNlcyhpbnQgKipBLCBpbnQgKipCLCBpbnQgKipDLCBpbnQgcm93cywgaW50IGNvbHMpOwp2b2lkIG11bHRpcGx5X21hdHJpY2VzKGludCAqKkEsIGludCAqKkIsIGludCAqKkMsIGludCByb3dzQSwgaW50IGNvbHNBLCBpbnQgY29sc0IpOwp2b2lkIHRyYW5zcG9zZV9tYXRyaXgoaW50ICoqQSwgaW50ICoqQiwgaW50IHJvd3MsIGludCBjb2xzKTsKCmludCBtYWluKCkgewogICAgaW50IG9wZXJhdGlvbjsKICAgIHByaW50Zigi0JLRi9Cx0LXRgNC40YLQtSDQvtC/0LXRgNCw0YbQuNGOOlxcbjEgLSDQodC70L7QttC10L3QuNC1INC80LDRgtGA0LjRhlxcbjIgLSDQo9C80L3QvtC20LXQvdC40LUg0LzQsNGC0YDQuNGGXFxuMyAtINCi0YDQsNC90YHQv9C+0L3QuNGA0L7QstCw0L3QuNC1INC80LDRgtGA0LjRhtGLXFxuIik7CiAgICBpZiAoc2NhbmYoIiVkIiwgJm9wZXJhdGlvbikgIT0gMSB8fCBvcGVyYXRpb24gPCAxIHx8IG9wZXJhdGlvbiA+IDMpIHsKICAgICAgICBwcmludGYoIm4vYVxcbiIpOwogICAgICAgIHJldHVybiAxOyAvLyDQntGI0LjQsdC60LAg0LLRi9Cx0L7RgNCwCiAgICB9CgogICAgaWYgKG9wZXJhdGlvbiA9PSAxKSB7CiAgICAgICAgLy8g0KHQu9C+0LbQtdC90LjQtSDQvNCw0YLRgNC40YYKICAgICAgICBpbnQgcm93cywgY29sczsKICAgICAgICBpZiAoc2NhbmYoIiVkICVkIiwgJnJvd3MsICZjb2xzKSAhPSAyIHx8IHJvd3MgPCAxIHx8IGNvbHMgPCAxIHx8IHJvd3MgPiBNQVhfU0laRSB8fCBjb2xzID4gTUFYX1NJWkUpIHsKICAgICAgICAgICAgcHJpbnRmKCJuL2FcXG4iKTsKICAgICAgICAgICAgcmV0dXJuIDE7IC8vINCe0YjQuNCx0LrQsCDQv9GA0Lgg0YHRh9C40YLRi9Cy0LDQvdC40Lgg0YDQsNC30LzQtdGA0L7QsiDQvNCw0YLRgNC40YYKICAgICAgICB9CgogICAgICAgIGludCAqKkEgPSBhbGxvY2F0ZV9tYXRyaXhfZHluYW1pYyhyb3dzLCBjb2xzKTsKICAgICAgICBpbnQgKipCID0gYWxsb2NhdGVfbWF0cml4X2R5bmFtaWMocm93cywgY29scyk7CiAgICAgICAgaW50ICoqQyA9IGFsbG9jYXRlX21hdHJpeF9keW5hbWljKHJvd3MsIGNvbHMpOwogICAgICAgIAogICAgICAgIGlmIChBID09IE5VTEwgfHwgQiA9PSBOVUxMIHx8IEMgPT0gTlVMTCkgewogICAgICAgICAgICBwcmludGYoIm4vYVxcbiIpOwogICAgICAgICAgICByZXR1cm4gMTsgLy8g0J7RiNC40LHQutCwINC/0YDQuCDQstGL0LTQtdC70LXQvdC40Lgg0L/QsNC80Y/RgtC4CiAgICAgICAgfQoKICAgICAgICByZWFkX21hdHJpeChBLCByb3dzLCBjb2xzKTsKICAgICAgICByZWFkX21hdHJpeChCLCByb3dzLCBjb2xzKTsKICAgICAgICBhZGRfbWF0cmljZXMoQSwgQiwgQywgcm93cywgY29scyk7CiAgICAgICAgcHJpbnRfbWF0cml4KEMsIHJvd3MsIGNvbHMpOwogICAgICAgIAogICAgICAgIGZyZWVfbWF0cml4X2R5bmFtaWMoQSwgcm93cyk7CiAgICAgICAgZnJlZV9tYXRyaXhfZHluYW1pYyhCLCByb3dzKTsKICAgICAgICBmcmVlX21hdHJpeF9keW5hbWljKEMsIHJvd3MpOwogICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT0gMikgewogICAgICAgIC8vINCj0LzQvdC+0LbQtdC90LjQtSDQvNCw0YLRgNC40YYKICAgICAgICBpbnQgcm93c0EsIGNvbHNBLCByb3dzQiwgY29sc0I7CiAgICAgICAgaWYgKHNjYW5mKCIlZCAlZCIsICZyb3dzQSwgJmNvbHNBKSAhPSAyIHx8IHJvd3NBIDwgMSB8fCBjb2xzQSA8IDEgfHwgcm93c0EgPiBNQVhfU0laRSB8fCBjb2xzQSA+IE1BWF9TSVpFKSB7CiAgICAgICAgICAgIHByaW50Zigibi9hXFxuIik7CiAgICAgICAgICAgIHJldHVybiAxOyAvLyDQntGI0LjQsdC60LAg0L/RgNC4INGB0YfQuNGC0YvQstCw0L3QuNC4INGA0LDQt9C80LXRgNC+0LIg0L/QtdGA0LLQvtC5INC80LDRgtGA0LjRhtGLCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChzY2FuZigiJWQgJWQiLCAmcm93c0IsICZjb2xzQikgIT0gMiB8fCByb3dzQiA8IDEgfHwgY29sc0IgPCAxIHx8IHJvd3NCID4gTUFYX1NJWkUgfHwgY29sc0IgPiBNQVhfU0laRSkgewogICAgICAgICAgICBwcmludGYoIm4vYVxcbiIpOwogICAgICAgICAgICByZXR1cm4gMTsgLy8g0J7RiNC40LHQutCwINC/0YDQuCDRgdGH0LjRgtGL0LLQsNC90LjQuCDRgNCw0LfQvNC10YDQvtCyINCy0YLQvtGA0L7QuSDQvNCw0YLRgNC40YbRiwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoY29sc0EgIT0gcm93c0IpIHsKICAgICAgICAgICAgcHJpbnRmKCJuL2FcXG4iKTsKICAgICAgICAgICAgcmV0dXJuIDE7IC8vINCe0YjQuNCx0LrQsCwg0LXRgdC70Lgg0LrQvtC70LjRh9C10YHRgtCy0L4g0YHRgtC+0LvQsdGG0L7QsiDQv9C10YDQstC+0Lkg0LzQsNGC0YDQuNGG0Ysg0L3QtSDRgdC+0LLQv9Cw0LTQsNC10YIg0YEg0LrQvtC70LjRh9C10YHRgtCy0L7QvCDRgdGC0YDQvtC6INCy0YLQvtGA0L7QuQogICAgICAgIH0KCiAgICAgICAgaW50ICoqQSA9IGFsbG9jYXRlX21hdHJpeF9keW5hbWljKHJvd3NBLCBjb2xzQSk7CiAgICAgICAgaW50ICoqQiA9IGFsbG9jYXRlX21hdHJpeF9keW5hbWljKHJvd3NCLCBjb2xzQik7CiAgICAgICAgaW50ICoqQyA9IGFsbG9jYXRlX21hdHJpeF9keW5hbWljKHJvd3NBLCBjb2xzQik7CiAgICAgICAgCiAgICAgICAgaWYgKEEgPT0gTlVMTCB8fCBCID09IE5VTEwgfHwgQyA9PSBOVUxMKSB7CiAgICAgICAgICAgIHByaW50Zigibi9hXFxuIik7CiAgICAgICAgICAgIHJldHVybiAxOyAvLyDQntGI0LjQsdC60LAg0L/RgNC4INCy0YvQtNC10LvQtdC90LjQuCDQv9Cw0LzRj9GC0LgKICAgICAgICB9CgogICAgICAgIHJlYWRfbWF0cml4KEEsIHJvd3NBLCBjb2xzQSk7CiAgICAgICAgcmVhZF9tYXRyaXgoQiwgcm93c0IsIGNvbHNCKTsKICAgICAgICBtdWx0aXBseV9tYXRyaWNlcyhBLCBCLCBDLCByb3dzQSwgY29sc0EsIGNvbHNCKTsKICAgICAgICBwcmludF9tYXRyaXgoQywgcm93c0EsIGNvbHNCKTsKICAgICAgICAKICAgICAgICBmcmVlX21hdHJpeF9keW5hbWljKEEsIHJvd3NBKTsKICAgICAgICBmcmVlX21hdHJpeF9keW5hbWljKEIsIHJvd3NCKTsKICAgICAgICBmcmVlX21hdHJpeF9keW5hbWljKEMsIHJvd3NBKTsKICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09IDMpIHsKICAgICAgICAvLyDQotGA0LDQvdGB0L/QvtC90LjRgNC+0LLQsNC90LjQtSDQvNCw0YLRgNC40YbRiwogICAgICAgIGludCByb3dzLCBjb2xzOwogICAgICAgIGlmIChzY2FuZigiJWQgJWQiLCAmcm93cywgJmNvbHMpICE9IDIgfHwgcm93cyA8IDEgfHwgY29scyA8IDEgfHwgcm93cyA+IE1BWF9TSVpFIHx8IGNvbHMgPiBNQVhfU0laRSkgewogICAgICAgICAgICBwcmludGYoIm4vYVxcbiIpOwogICAgICAgICAgICByZXR1cm4gMTsgLy8g0J7RiNC40LHQutCwINC/0YDQuCDRgdGH0LjRgtGL0LLQsNC90LjQuCDRgNCw0LfQvNC10YDQvtCyINC80LDRgtGA0LjRhtGLCiAgICAgICAgfQoKICAgICAgICBpbnQgKipBID0gYWxsb2NhdGVfbWF0cml4X2R5bmFtaWMocm93cywgY29scyk7CiAgICAgICAgaW50ICoqQiA9IGFsbG9jYXRlX21hdHJpeF9keW5hbWljKGNvbHMsIHJvd3MpOyAvLyDQotGA0LDQvdGB0L/QvtC90LjRgNC+0LLQsNC90L3QsNGPINC80LDRgtGA0LjRhtCwCgogICAgICAgIGlmIChBID09IE5VTEwgfHwgQiA9PSBOVUxMKSB7CiAgICAgICAgICAgIHByaW50Zigibi9hXFxuIik7CiAgICAgICAgICAgIHJldHVybiAxOyAvLyDQntGI0LjQsdC60LAg0L/RgNC4INCy0YvQtNC10LvQtdC90LjQuCDQv9Cw0LzRj9GC0LgKICAgICAgICB9CgogICAgICAgIHJlYWRfbWF0cml4KEEsIHJvd3MsIGNvbHMpOwogICAgICAgIHRyYW5zcG9zZV9tYXRyaXgoQSwgQiwgcm93cywgY29scyk7CiAgICAgICAgcHJpbnRfbWF0cml4KEIsIGNvbHMsIHJvd3MpOwogICAgICAgIAogICAgICAgIGZyZWVfbWF0cml4X2R5bmFtaWMoQSwgcm93cyk7CiAgICAgICAgZnJlZV9tYXRyaXhfZHluYW1pYyhCLCBjb2xzKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKLy8g0JTQuNC90LDQvNC40YfQtdGB0LrQvtC1INCy0YvQtNC10LvQtdC90LjQtTogMkQg0LzQsNGB0YHQuNCyCmludCAqKmFsbG9jYXRlX21hdHJpeF9keW5hbWljKGludCByb3dzLCBpbnQgY29scykgewogICAgaW50ICoqbWF0cml4ID0gbWFsbG9jKHJvd3MgKiBzaXplb2YoaW50ICopKTsKICAgIGlmIChtYXRyaXggPT0gTlVMTCkgcmV0dXJuIE5VTEw7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBtYXRyaXhbaV0gPSBtYWxsb2MoY29scyAqIHNpemVvZihpbnQpKTsKICAgICAgICBpZiAobWF0cml4W2ldID09IE5VTEwpIHsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKICAgICAgICAgICAgICAgIGZyZWUobWF0cml4W2pdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlKG1hdHJpeCk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXRyaXg7Cn0KCi8vINCe0YHQstC+0LHQvtC20LTQtdC90LjQtSDQv9Cw0LzRj9GC0Lgg0LTQu9GPINC00LjQvdCw0LzQuNGH0LXRgdC60L7QuSDQvNCw0YLRgNC40YbRiwp2b2lkIGZyZWVfbWF0cml4X2R5bmFtaWMoaW50ICoqbWF0cml4LCBpbnQgcm93cykgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBmcmVlKG1hdHJpeFtpXSk7CiAgICB9CiAgICBmcmVlKG1hdHJpeCk7Cn0KCi8vINCn0YLQtdC90LjQtSDQvNCw0YLRgNC40YbRiwp2b2lkIHJlYWRfbWF0cml4KGludCAqKm1hdHJpeCwgaW50IHJvd3MsIGludCBjb2xzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB7CiAgICAgICAgICAgIGlmIChzY2FuZigiJWQiLCAmbWF0cml4W2ldW2pdKSAhPSAxKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIm4vYVxcbiIpOwogICAgICAgICAgICAgICAgZXhpdCgxKTsgLy8g0J7RiNC40LHQutCwINC/0YDQuCDRgdGH0LjRgtGL0LLQsNC90LjQuAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovLyDQn9C10YfQsNGC0Ywg0LzQsNGC0YDQuNGG0YsKdm9pZCBwcmludF9tYXRyaXgoaW50ICoqbWF0cml4LCBpbnQgcm93cywgaW50IGNvbHMpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKICAgICAgICAgICAgcHJpbnRmKCIlZCIsIG1hdHJpeFtpXVtqXSk7CiAgICAgICAgICAgIGlmIChqIDwgY29scyAtIDEpIHsKICAgICAgICAgICAgICAgIHByaW50ZigiICIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpIDwgcm93cyAtIDEpIHsKICAgICAgICAgICAgcHJpbnRmKCJcXG4iKTsKICAgICAgICB9CiAgICB9Cn0KCi8vINCh0LvQvtC20LXQvdC40LUg0LzQsNGC0YDQuNGGCnZvaWQgYWRkX21hdHJpY2VzKGludCAqKkEsIGludCAqKkIsIGludCAqKkMsIGludCByb3dzLCBpbnQgY29scykgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgewogICAgICAgICAgICBDW2ldW2pdID0gQVtpXVtqXSArIEJbaV1bal07CiAgICAgICAgfQogICAgfQp9CgovLyDQo9C80L3QvtC20LXQvdC40LUg0LzQsNGC0YDQuNGGCnZvaWQgbXVsdGlwbHlfbWF0cmljZXMoaW50ICoqQSwgaW50ICoqQiwgaW50ICoqQywgaW50IHJvd3NBLCBpbnQgY29sc0EsIGludCBjb2xzQikgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzQTsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzQjsgaisrKSB7CiAgICAgICAgICAgIENbaV1bal0gPSAwOyAvLyDQmNC90LjRhtC40LDQu9C40LfQsNGG0LjRjyDRjdC70LXQvNC10L3RgtCwIEMKICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBjb2xzQTsgaysrKSB7CiAgICAgICAgICAgICAgICBDW2ldW2pdICs9IEFbaV1ba10gKiBCW2tdW2pdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovLyDQotGA0LDQvdGB0L/QvtC90LjRgNC+0LLQsNC90LjQtSDQvNCw0YLRgNC40YbRiwp2b2lkIHRyYW5zcG9zZV9tYXRyaXgoaW50ICoqQSwgaW50ICoqQiwgaW50IHJvd3MsIGludCBjb2xzKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB7CiAgICAgICAgICAgIEJbal1baV0gPSBBW2ldW2pdOwogICAgICAgIH0KICAgIH0KfQ==