#include <iostream>
#include <vector>
using namespace std;
void ToPrint(int n, int m, int *currentNumberColumn, int *currentNumberRow, int symbolToPrint) {
(*currentNumberColumn)++; // Инкрементируем значение номера столбца, так как есть символ на печать
if (*currentNumberColumn > n) {
cout << endl; // Переходим на новую строку
(*currentNumberRow)++;
*currentNumberColumn = 1;
} // Если следует выполнить переход на следующую строку, выполняем этот переход по всем индексам
if (*currentNumberRow > m)
exit(0); // Заканчиваем работу программы, как только количество строк превышает заданное
else if (symbolToPrint == 32 && *currentNumberColumn == 1) // В таблице ASCII 32 - пробел
(*currentNumberColumn)--; // Возвращаем предыдущее значение номера столбца, так как ничего не было напечатано
else if (symbolToPrint == 32)
cout << char(symbolToPrint); // Выводим пробел, если это не начало строки
else
cout << symbolToPrint;
}
int main() {
int n, m; // Количество столбцов и строк соответственно
cin >> n >> m;
int start = 0; // Индекс элемента текущей цифры с которой ведется сравнение
int quantity = 0; // Количество идущих подряд одинаковых элементов в данном члене
int currentNumberRow = 1; // Номер текущей строки, в которой будет записан символ
int currentNumberColumn = 0; // Номер текущего столбца, в который будет записан символ
vector <short> currentTerm; // Вектор, хранящий значение текущего члена последовательности
vector <short> previousTerm; // Вектор, хранящий значение предыдущего члена последовательности
previousTerm.push_back(0); // Записываем в вектор предыдущего члена значение первого члена последовательности
ToPrint(n, m, ¤tNumberColumn, ¤tNumberRow, 0); // Выводим первый член последовательности
ToPrint(n, m, ¤tNumberColumn, ¤tNumberRow, 32); // Выводим пробел после него (если он не понадобится его уберет метод ToPrint)
while (true) {
for (int i = 0; i < previousTerm.size(); i++) {
if (previousTerm[i] == previousTerm[start])
quantity++; // Считаем количество идущих подряд одинаковых цифр
else {
currentTerm.push_back(quantity); // Записываем в вектор количество текущих цифр
currentTerm.push_back(previousTerm[start]); // Записываем саму цифру
ToPrint(n, m, ¤tNumberColumn, ¤tNumberRow, quantity);
ToPrint(n, m, ¤tNumberColumn, ¤tNumberRow, previousTerm[start]); // Печатаем полученные данные
start += quantity; // Переходим к следующей цифре для сравнения
quantity = 1; // Присваиваем количеству одинаковых идущих подряд цифр 1, так как мы перешли к следующей цифре
} // Если значение текущей цифры не совпадает с предыдущим, выполняем вывод и заполнение вектора следующего члена
if (i == (previousTerm.size() - 1)) {
currentTerm.push_back(quantity);
currentTerm.push_back(previousTerm[start]);
ToPrint(n, m, ¤tNumberColumn, ¤tNumberRow, quantity);
ToPrint(n, m, ¤tNumberColumn, ¤tNumberRow, previousTerm[start]);
} // Отдельный вывод для последнего элемента данного члена
} // Цикл для прохода по всем цифрам предыдущего члена последовательности
start = 0;
quantity = 0; // Обнуляем все параметры для подсчета, так как дальше будем работать со следующим членом последовательности
ToPrint(n, m, ¤tNumberColumn, ¤tNumberRow, 32); // Печатаем пробел после текущего члена последовательности
previousTerm.clear();
previousTerm = currentTerm; // Записываем в вектор предыдущего члена текущий построенный член последовательности
currentTerm.clear();
} // Бесконечный цикл, так как условие окончание работы программы задано в методе печати
}