#include <bits/stdc++.h> #define ll long long using namespace std; string kierunek[6] = {"A", "B", "C", "D", "E", "F"}; enum { PRAWO, PRAWY_DOL, LEWY_DOL, LEWO, LEWA_GORA, PRAWA_GORA }; string n_razy(ll n, string &wzorek) { if (n == 0) return ""; string res; if (n == 1) { return wzorek; } if (n <= 9) { string prefix(1, (char)('0') + n); if (wzorek.size() == 1) return prefix + wzorek; else return prefix + "[" + wzorek + "]"; } else { return "9[" + n_razy(n / 9, wzorek) + "]" + n_razy(n % 9, wzorek); } return res; } string rownoleglobok(ll wysokosc, ll szerokosc) { string zygzak = kierunek[LEWA_GORA] + kierunek[LEWY_DOL]; string zygzak_w_lewo = n_razy(szerokosc - 1, zygzak) + kierunek[LEWA_GORA]; string prosto_w_prawo = n_razy(szerokosc, kierunek[PRAWO]); string wiersz = prosto_w_prawo + zygzak_w_lewo; return n_razy(wysokosc, wiersz); } string podstawka(ll n) { string zygzak = "BF"; return n_razy(n - 1, zygzak) + "B" + n_razy(n, kierunek[LEWO]) + "F"; } string trojkat(ll n); string trojkat_bez_krawedzi(ll n) { if (n == 1) return ""; if (n == 2) return kierunek[LEWO] + kierunek[PRAWY_DOL] + kierunek[PRAWA_GORA]; if (n == 3) return "DBDBFBFDF"; string zygzak_lewy_dol = kierunek[LEWO] + kierunek[PRAWY_DOL]; string zygzak_prawo = kierunek[PRAWA_GORA] + kierunek[PRAWY_DOL]; string zygzak_lewa_gora = kierunek[PRAWA_GORA] + kierunek[LEWO]; if (n % 2 == 0 && n > 4) { return n_razy(n - 3, zygzak_lewy_dol) + trojkat(n - 3) + n_razy(2, zygzak_lewy_dol) + n_razy(n - 2, zygzak_prawo) + n_razy(n - 2, zygzak_lewa_gora) + kierunek[PRAWA_GORA]; } return n_razy(n - 1, zygzak_lewy_dol) + kierunek[PRAWA_GORA] + trojkat(n - 3) + kierunek[PRAWY_DOL] + n_razy(n - 3, zygzak_prawo) + n_razy(n - 2, zygzak_lewa_gora) + kierunek[PRAWA_GORA]; // TODO } string trojkat_z_prawa(ll n) { return kierunek[PRAWY_DOL] + trojkat_bez_krawedzi(n) + n_razy(n - 1, kierunek[PRAWY_DOL]); } string trojkat(ll n) { if (n == 1) { return "FBD"; } if (n % 2 == 1) { return podstawka(n) + trojkat(n - 1); } else { string trojkat_prawy = trojkat_z_prawa(n / 2); return rownoleglobok(n / 2, n / 2) + n_razy(n / 2, kierunek[PRAWA_GORA]) + n_razy(2, trojkat_prawy) + n_razy(n / 2, kierunek[LEWO]) + n_razy(n / 2, kierunek[PRAWA_GORA]) + n_razy(n / 2, kierunek[LEWO]) + n_razy(n / 2, kierunek[LEWY_DOL]); return ""; } } int32_t main() { ios_base::sync_with_stdio(0); ll n; cin >> n; cout << trojkat(n) << "\n"; }
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 | #include <bits/stdc++.h> #define ll long long using namespace std; string kierunek[6] = {"A", "B", "C", "D", "E", "F"}; enum { PRAWO, PRAWY_DOL, LEWY_DOL, LEWO, LEWA_GORA, PRAWA_GORA }; string n_razy(ll n, string &wzorek) { if (n == 0) return ""; string res; if (n == 1) { return wzorek; } if (n <= 9) { string prefix(1, (char)('0') + n); if (wzorek.size() == 1) return prefix + wzorek; else return prefix + "[" + wzorek + "]"; } else { return "9[" + n_razy(n / 9, wzorek) + "]" + n_razy(n % 9, wzorek); } return res; } string rownoleglobok(ll wysokosc, ll szerokosc) { string zygzak = kierunek[LEWA_GORA] + kierunek[LEWY_DOL]; string zygzak_w_lewo = n_razy(szerokosc - 1, zygzak) + kierunek[LEWA_GORA]; string prosto_w_prawo = n_razy(szerokosc, kierunek[PRAWO]); string wiersz = prosto_w_prawo + zygzak_w_lewo; return n_razy(wysokosc, wiersz); } string podstawka(ll n) { string zygzak = "BF"; return n_razy(n - 1, zygzak) + "B" + n_razy(n, kierunek[LEWO]) + "F"; } string trojkat(ll n); string trojkat_bez_krawedzi(ll n) { if (n == 1) return ""; if (n == 2) return kierunek[LEWO] + kierunek[PRAWY_DOL] + kierunek[PRAWA_GORA]; if (n == 3) return "DBDBFBFDF"; string zygzak_lewy_dol = kierunek[LEWO] + kierunek[PRAWY_DOL]; string zygzak_prawo = kierunek[PRAWA_GORA] + kierunek[PRAWY_DOL]; string zygzak_lewa_gora = kierunek[PRAWA_GORA] + kierunek[LEWO]; if (n % 2 == 0 && n > 4) { return n_razy(n - 3, zygzak_lewy_dol) + trojkat(n - 3) + n_razy(2, zygzak_lewy_dol) + n_razy(n - 2, zygzak_prawo) + n_razy(n - 2, zygzak_lewa_gora) + kierunek[PRAWA_GORA]; } return n_razy(n - 1, zygzak_lewy_dol) + kierunek[PRAWA_GORA] + trojkat(n - 3) + kierunek[PRAWY_DOL] + n_razy(n - 3, zygzak_prawo) + n_razy(n - 2, zygzak_lewa_gora) + kierunek[PRAWA_GORA]; // TODO } string trojkat_z_prawa(ll n) { return kierunek[PRAWY_DOL] + trojkat_bez_krawedzi(n) + n_razy(n - 1, kierunek[PRAWY_DOL]); } string trojkat(ll n) { if (n == 1) { return "FBD"; } if (n % 2 == 1) { return podstawka(n) + trojkat(n - 1); } else { string trojkat_prawy = trojkat_z_prawa(n / 2); return rownoleglobok(n / 2, n / 2) + n_razy(n / 2, kierunek[PRAWA_GORA]) + n_razy(2, trojkat_prawy) + n_razy(n / 2, kierunek[LEWO]) + n_razy(n / 2, kierunek[PRAWA_GORA]) + n_razy(n / 2, kierunek[LEWO]) + n_razy(n / 2, kierunek[LEWY_DOL]); return ""; } } int32_t main() { ios_base::sync_with_stdio(0); ll n; cin >> n; cout << trojkat(n) << "\n"; } |