1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Marcin Knapik

#pragma GCC optimize ("O3")
#include<bits/stdc++.h>
using namespace std;

#define FOR(i, n) for (int i = 0; i < n; i++)
#define f first
#define s second
#define pb push_back
#define all(s) s.begin(), s.end()
#define sz(s) (int)s.size()

using ll = long long;

string system9 (ll x) {
    // im większe pozycje w stringu, tym większe cyfry znaczące
    if (x == 0) {
        return "0";
    }

    assert (x > 0);
    string ret;

    while (x > 0) {
        ret += '0' + x % 9;
        x /= 9; 
    }

    // reverse(all(ret));
    return ret;
}

string opatul(string wyraz, char cyfra){
    if(cyfra == '0') {
        return "";
    }
    
    if(cyfra == '1'){
        return wyraz;
    }

    if(sz(wyraz) == 1){
        return string(1, cyfra) + wyraz; 
    }
    return string(1, cyfra) + "[" + wyraz + "]"; 
}

string powtorz(string wyraz, ll ile){
    string ile9 = system9(ile);
    
    string ret = "";
    for(int i = 0; i < sz(ile9) - 1; i++){
        ret += "9[";
    }
    for(int i = sz(ile9) - 1; i >= 1; i--){
        if(ile9[i] != '0')
            ret += opatul(wyraz, ile9[i]);
        ret += "]";
    }
    ret += opatul(wyraz, ile9[0]);
    return ret;
}

string trapez (ll wys, ll szer) {
    string pasek = powtorz("FB", szer) + "F" + powtorz("D", szer);
    return powtorz(pasek, wys);
}

string caly_trojkat (ll);

string trojkat_bez_lewej_i_dolu (ll n) {
    assert(n > 0);
    
    if(n == 1){
        return "B";
    }

    return powtorz("BD", n - 1) +
           "BF" +
           caly_trojkat(n - 2) +
           powtorz("BF", n - 2) + 
           "B";
}

string caly_trojkat (ll n) {
    if (n == 0) {
        return "";
    }

    if (n == 1) {
        return "FBD";
    }

    ll szer = n / 2;
    ll wys = (n + 1) / 2;

    string ret = trapez(wys, szer) + powtorz("F", n - wys);

    // od tej pory wys, to wysokosc trojkata
    wys = n - wys;
    ret += powtorz(trojkat_bez_lewej_i_dolu(wys), 2);
    
    if (n & 1) {
        ret += powtorz("D", wys) + powtorz("BF", wys) + "B";
    }

    ret += powtorz("D", n);

    return ret;
}

void solve () {
    ll n;
    cin >> n;

    cout << caly_trojkat(n) << '\n';
}

int main () {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int tests = 1;
    // cin >> tests;

    for (int test = 1; test <= tests; test++) {
        solve();
    }

    return 0;
}