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
#include <bits/stdc++.h>
#define ll long long
using namespace std;

string lit(int x)// litera odpowiadajacemu kierunkowi x*60 stopni ccw
{
	string ret;
	x %= 6;
	if(x <= 0) x += 6;
	ret += 'A' + 6-x;
	return ret;
}
string razy(ll n, string s)// n razy robimy s
{
	if(!n) return "";
	if(n == 1ll) return s;
	if(n <= 9ll)
	{
		string ret;
		ret += '0'+n;
		if((int)s.length() == 1) ret += s;
		else ret += "[" + s + "]";
		return ret;
	}
	if(n%9ll) return razy(n%9ll, s) + razy(n-n%9ll, s);
	return "9[" + razy(n/9ll, s) + "]";
}

string solve(ll n, int kier)// trojkat o boku n bez podstawy, zaczynamy w lewym rogu, konczymy w prawym; kier obraca calosc ccw o 60 stopni
{
	kier %= 6;
	if(n == 1ll) return lit(kier+1)+lit(kier-1);
	string ret;
	if(n&1ll)
	{
		ret += razy(n, lit(kier+1));
		ret += "2[" + solve(n>>1ll, kier-2) + "]";
		ret += razy(n-1ll, lit(kier-1)+lit(kier+1));
		ret += razy(n>>1ll, razy(n>>1ll, lit(kier+2)) + lit(kier-2) + razy((n>>1ll)-1ll, lit(kier)+lit(kier-2)));
		ret += razy(n>>1ll, lit(kier));
		ret += lit(kier-1);
	}
	else
	{
		ret += lit(kier+1);
		ret += solve(n-1ll, kier);
		ret += razy(n-1ll, lit(kier+3));
		ret += lit(kier-1);
		ret += razy(n-1ll, lit(kier+1)+lit(kier-1));
	}
	return ret;
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	
	ll n;
	cin >> n;
	string wyn = solve(n, 0);
	wyn += razy(n, "D");
	cout << wyn;
	
	return 0;
}