#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
constexpr char dir_letter[6] = {'A', 'B', 'C', 'D', 'E', 'F'};
inline char digit(int x) { return '0' + x; }
inline int mod6(int x) { x %= 6; if (x < 0) x += 6; return x; }
string repeat(const string& pattern, ll n)
{
//string result = n >= 9 ? string("9[") + repeat(pattern, n/9) + ']' : "";
string result = "";
if (n >= 9)
{
string partial_result = repeat(pattern, n/9);
if (partial_result.size() == 1)
result += string("9") + repeat(pattern, n/9);
else
result += string("9[") + repeat(pattern, n/9) + ']';
}
int x = n % 9;
//if (x != 0)
// result += string() + digit(x) + '[' + pattern + ']';
///* // small optimalisation
if (x > 0)
{
if (x == 1)
result += pattern;
else
{
if (pattern.size() == 1)
result += string() + digit(x) + pattern;
else
result += string() + digit(x) + '[' + pattern + ']';
}
}
//*/
return result;
}
string line(int dir, ll n)
{
return repeat(string(1, dir_letter[dir]), n);
}
string zigzag(int dir, ll n)
{
return repeat(string() + dir_letter[dir] + dir_letter[mod6(dir-2)], n) + dir_letter[dir];
}
string truss(int dir, ll n, ll h)
{
return repeat(line(dir, n) + zigzag(mod6(dir-2), n-1), h);
}
string truss(int dir, ll n)
{
return truss(dir, n, n);
}
string triangle(int dir, ll n)
{
if (n == 0)
return string();
if (n == 1)
return string() + dir_letter[dir] + dir_letter[mod6(dir-2)] + dir_letter[mod6(dir-4)];
if (n % 2 == 0)
{
ll truss_n = n/2;
ll lower_triangle_n = n - truss_n;
ll upper_triangle_n = n - truss_n - 1;
return truss(dir, truss_n) +
line(dir, truss_n) +
triangle(mod6(dir+2), lower_triangle_n) +
zigzag(mod6(dir-2), truss_n-1) +
triangle(dir, upper_triangle_n) +
line(mod6(dir+2), truss_n+1);
}
else
{
ll truss_n = n/2 + 1;
ll lower_triangle_n = n - truss_n;
ll upper_triangle_n = n - truss_n;
return truss(dir, truss_n, truss_n-1) +
line(dir, truss_n) +
triangle(mod6(dir+2), lower_triangle_n) +
zigzag(mod6(dir-2), truss_n-1) +
triangle(dir, upper_triangle_n) +
line(mod6(dir+2), truss_n);
}
}
int main()
{
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//for (ll i = 0; i < 100; i++)
// cout << i << " -> " << zigzag(0, i) << "\n";
//ll ten[19];
//ten[0] = 1;
//for (int i = 1; i <= 18; i++)
// ten[i] = ten[i-1] * 10;
//ll n = ten[5];
//ll n = 10;
//for (ll i = 1; i <= ten[18]; i *= 2)
// cout << i << " -> " << triangle(0, i).size() << endl;
//cout << triangle(0, n).size() << endl;
ll n; cin >> n;
cout << triangle(0, 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 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 | #include <bits/stdc++.h> using namespace std; typedef long long ll; constexpr char dir_letter[6] = {'A', 'B', 'C', 'D', 'E', 'F'}; inline char digit(int x) { return '0' + x; } inline int mod6(int x) { x %= 6; if (x < 0) x += 6; return x; } string repeat(const string& pattern, ll n) { //string result = n >= 9 ? string("9[") + repeat(pattern, n/9) + ']' : ""; string result = ""; if (n >= 9) { string partial_result = repeat(pattern, n/9); if (partial_result.size() == 1) result += string("9") + repeat(pattern, n/9); else result += string("9[") + repeat(pattern, n/9) + ']'; } int x = n % 9; //if (x != 0) // result += string() + digit(x) + '[' + pattern + ']'; ///* // small optimalisation if (x > 0) { if (x == 1) result += pattern; else { if (pattern.size() == 1) result += string() + digit(x) + pattern; else result += string() + digit(x) + '[' + pattern + ']'; } } //*/ return result; } string line(int dir, ll n) { return repeat(string(1, dir_letter[dir]), n); } string zigzag(int dir, ll n) { return repeat(string() + dir_letter[dir] + dir_letter[mod6(dir-2)], n) + dir_letter[dir]; } string truss(int dir, ll n, ll h) { return repeat(line(dir, n) + zigzag(mod6(dir-2), n-1), h); } string truss(int dir, ll n) { return truss(dir, n, n); } string triangle(int dir, ll n) { if (n == 0) return string(); if (n == 1) return string() + dir_letter[dir] + dir_letter[mod6(dir-2)] + dir_letter[mod6(dir-4)]; if (n % 2 == 0) { ll truss_n = n/2; ll lower_triangle_n = n - truss_n; ll upper_triangle_n = n - truss_n - 1; return truss(dir, truss_n) + line(dir, truss_n) + triangle(mod6(dir+2), lower_triangle_n) + zigzag(mod6(dir-2), truss_n-1) + triangle(dir, upper_triangle_n) + line(mod6(dir+2), truss_n+1); } else { ll truss_n = n/2 + 1; ll lower_triangle_n = n - truss_n; ll upper_triangle_n = n - truss_n; return truss(dir, truss_n, truss_n-1) + line(dir, truss_n) + triangle(mod6(dir+2), lower_triangle_n) + zigzag(mod6(dir-2), truss_n-1) + triangle(dir, upper_triangle_n) + line(mod6(dir+2), truss_n); } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); //for (ll i = 0; i < 100; i++) // cout << i << " -> " << zigzag(0, i) << "\n"; //ll ten[19]; //ten[0] = 1; //for (int i = 1; i <= 18; i++) // ten[i] = ten[i-1] * 10; //ll n = ten[5]; //ll n = 10; //for (ll i = 1; i <= ten[18]; i *= 2) // cout << i << " -> " << triangle(0, i).size() << endl; //cout << triangle(0, n).size() << endl; ll n; cin >> n; cout << triangle(0, n) << "\n"; } |
English