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 | #include <stdio.h>
#define decl_dir(name, letter) \
void name(long long) { printf(letter); } \
void name() { name(0); }
decl_dir(r, "A")
decl_dir(dr, "B")
decl_dir(dl, "C")
decl_dir(l, "D")
decl_dir(ul, "E")
decl_dir(ur, "F")
#define decl_dir_pair(name1, name2) \
void name1##_##name2(long long n) { name1(); name2(); } \
void name1##_##name2() { name1##_##name2(0); }
decl_dir_pair(dl, ul);
decl_dir_pair(ul, dl);
decl_dir_pair(dr, ur);
decl_dir_pair(ul, r);
decl_dir_pair(r, dl);
decl_dir_pair(l, dr);
decl_dir_pair(r, ul);
void rep(void (*fn)(long long), long long n, long long k)
{
if (k == 0) return;
for (int i = 9; i >= 2; i--) {
if (k % i == 0) {
printf("%d[", i);
rep(fn, n, k/i);
printf("]");
return;
}
}
fn(n);
rep(fn, n, k-1);
}
void rep(void (*fn)(long long), long long k)
{
rep(fn, 0, k);
}
void rhombus1(long long n)
{
rep(r, n);
rep(dl_ul, n);
dl();
}
void rhombus(long long n)
{
if (n == 0) return;
rep(rhombus1, n, n);
rep(r, n);
}
void tri(long long n);
void two_tri(long long n)
{
printf("2[");
dl();
tri(n);
rep(r_dl, n);
r();
printf("]");
}
void tri(long long n)
{
if (n == 0) return;
if (n == 1) {
dl(); r(); ul();
return;
}
if (n == 2) {
dl(); dl();
r(); ul(); r(); dl(); r();
ul(); ul();
return;
}
long long n_odd = (n & 1) ? n : n-1;
dr();
two_tri(n_odd/2 - 1);
rep(ul, n_odd-1);
rep(l_dr, n_odd/2 + 1);
rhombus(n_odd/2 - 1);
r();
rep(ul_r, n_odd/2 - 1);
rep(ul_dl, n_odd/2);
rep(l_dr, n_odd/2 - 1);
l();
if (!(n & 1)) {
rep(dr_ur, n-1);
dr();
rep(l, n);
ur();
}
rep(ur, n_odd);
}
int main(void)
{
long long n;
scanf("%lld", &n);
tri(n);
printf("\n");
return 0;
}
|