#include <iostream>
#include <vector>
#include <string>
using namespace std;
// Funkcja rekurencyjna do generowania zbioru Cantora
void cantor(string &line, int left, int right, int level) {
if (level == 0) return;
int third = (right - left + 1) / 3;
// usuwamy środkową część (zamieniamy na spacje)
for (int i = left + third; i < left + 2 * third; i++) {
line[i] = ' ';
}
// rekurencja dla lewej i prawej części
cantor(line, left, left + third - 1, level - 1);
cantor(line, left + 2 * third, right, level - 1);
}
int main() {
const int maxLevel = 6;
for (int level = 0; level <= maxLevel; level++) {
int length = 1;
for (int i = 0; i < level; i++) {
length *= 3;
}
string line(length, '#');
cantor(line, 0, length - 1, level);
cout << line << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIEZ1bmtjamEgcmVrdXJlbmN5am5hIGRvIGdlbmVyb3dhbmlhIHpiaW9ydSBDYW50b3JhCnZvaWQgY2FudG9yKHN0cmluZyAmbGluZSwgaW50IGxlZnQsIGludCByaWdodCwgaW50IGxldmVsKSB7CiAgICBpZiAobGV2ZWwgPT0gMCkgcmV0dXJuOwoKICAgIGludCB0aGlyZCA9IChyaWdodCAtIGxlZnQgKyAxKSAvIDM7CgogICAgLy8gdXN1d2FteSDFm3JvZGtvd8SFIGN6xJnFm8SHICh6YW1pZW5pYW15IG5hIHNwYWNqZSkKICAgIGZvciAoaW50IGkgPSBsZWZ0ICsgdGhpcmQ7IGkgPCBsZWZ0ICsgMiAqIHRoaXJkOyBpKyspIHsKICAgICAgICBsaW5lW2ldID0gJyAnOwogICAgfQoKICAgIC8vIHJla3VyZW5jamEgZGxhIGxld2VqIGkgcHJhd2VqIGN6xJnFm2NpCiAgICBjYW50b3IobGluZSwgbGVmdCwgbGVmdCArIHRoaXJkIC0gMSwgbGV2ZWwgLSAxKTsKICAgIGNhbnRvcihsaW5lLCBsZWZ0ICsgMiAqIHRoaXJkLCByaWdodCwgbGV2ZWwgLSAxKTsKfQoKaW50IG1haW4oKSB7CiAgICBjb25zdCBpbnQgbWF4TGV2ZWwgPSA2OwoKICAgIGZvciAoaW50IGxldmVsID0gMDsgbGV2ZWwgPD0gbWF4TGV2ZWw7IGxldmVsKyspIHsKICAgICAgICBpbnQgbGVuZ3RoID0gMTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxldmVsOyBpKyspIHsKICAgICAgICAgICAgbGVuZ3RoICo9IDM7CiAgICAgICAgfQoKICAgICAgICBzdHJpbmcgbGluZShsZW5ndGgsICcjJyk7CgogICAgICAgIGNhbnRvcihsaW5lLCAwLCBsZW5ndGggLSAxLCBsZXZlbCk7CgogICAgICAgIGNvdXQgPDwgbGluZSA8PCBlbmRsOwogICAgfQoKICAgIHJldHVybiAwOwp9