module main; // https://kmjp.hatenablog.jp/entry/2015/10/24/0900 より // ビット演算、数え上げ import std; import core.bitop; // 二項係数(Knuthの方法、オーバーフローは考慮していない) long binom(long n, long k) { if (n < k || k < 0) return 0L; if (n - k < k) k = n - k; if (k == 0) return 1L; if (k == 1) return n; static long[long][long] memo; if (n !in memo || k !in memo[n]) { memo[n][k] = binom(n - 1, k - 1) * n / k; } return memo[n][k]; } void main() { // 入力 int N = readln.chomp.to!int; // 答えの計算と出力 foreach (d; 2 .. 31) { long p = 0; foreach (n5; 0 .. d) if ((n5 + 1) % 3 == 0) p += binom(d - 1, n5); if (p >= N) { for (int mask = 1;; mask += 2) { if (popcnt(mask) % 3 != 0) continue; if (--N == 0) { char[] s; foreach (x; 0 .. d) s ~= '3' + ((mask & (1 << x)) != 0) * 2; writeln(s.reverse); return; } } } else N -= p; } }