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