// 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; }
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; } |