Problem:
短歌数

願はくは 花の下にて 春死なむ そのきさらぎの 望月のころ

これは，西行法師が詠んだとされる，有名な短歌の一つである．
短歌は，日本において古くから親しまれている和歌の一種であり，その多くは 5・7・5・7・7 の五句三十一音からなる．

ところで，57577 という数は，5 と 7 の二種類の数字からなる．
このような，十進表記がちょうど二種類の数字からなる正の整数を，短歌数と呼ぶことにする．
例えば，10, 12, 57577, 25252 などは短歌数であるが，5, 11, 123, 20180701 などは短歌数ではない．

正の整数 N が与えられる．N 番目に小さい短歌数を求めよ．

Input

入力は最大で 100 個のデータセットからなる．各データセットは次の形式で表される．

N

整数 N は 1 ≤ N ≤ 1018 を満たす．

入力の終わりは 1 つのゼロからなる行で表される．

Output

各データセットについて，N 番目に小さい短歌数を 1 行に出力せよ．

Sample Input

1
2
3
390
1124
1546
314159265358979323
0

Output for the Sample Input

10
12
13
2020
25252
57577
7744444777744474777777774774744777747477444774744744

Solution in Scala (judge verdict: Accepted)

import scala.annotation.tailrec
import scala.io.StdIn._
object Main extends App {
  solve()
  @tailrec def solve(): Unit = {
    val rank = readLong()
    if (rank == 0) return
    println(solve(rank))
    solve()
  }
  def countDigit(digit: Int): Long = {
    digit match {
      case 0 | 1 ⇒ 0
      case _ ⇒ 36 * ((1L << digit) - 2) + 9 * ((1L << (digit - 1)) - 1)
    }
  }
  def make(firstDigit: Int, digit: Int, rank: Long): List[Int] = {
    var rest = rank
    for (i ← 0 until 10) {
      if (i == firstDigit) {
        if (rest < 9 * ((1L << (digit - 1)) - 1)) {
          return firstDigit :: make(firstDigit, digit - 1, rest)
        }else {
          rest -= 9 * ((1L << (digit - 1)) - 1)
        }
      }else {
        if (rest < (1L << (digit - 1))) {
          val min = Math.min(firstDigit, i)
          val max = Math.max(firstDigit, i)
          return if (digit > 1) i::rest.toBinaryString.rightJust(digit - 1){'0'}.map{
            case '0' ⇒ min
            case '1' ⇒ max
          }.toList else List(i)
        }else {
          rest -= 1L << (digit - 1)
        }
      }
    }
    ???
  }
  def calDigit(rank: Long, digit: Int): Int = {
    if (rank < countDigit(digit)) {
      digit
    }else {
      calDigit(rank - countDigit(digit), digit + 1)
    }
  }
  def solve(rank: Long): String = {
    val digit = calDigit(rank - 1, 2)
    var rest = rank - 1 - (2 until digit).map(countDigit).sum
    for (i ← 1 until 10) {
      if (rest >= 9 * ((1L << (digit - 1)) - 1)) {
        rest -= 9 * ((1L << (digit - 1)) - 1)
      }else {
        return (i::make(i, digit - 1, rest)).mkString("")
      }
    }
    ???
  }
  implicit class StringExtension(val str: String) extends AnyVal {
    def rightJust(length: Int)(word: ⇒ Char): String = {
      if (str.length < length) word.toString * (length - str.length) + str
      else str
    }
  }
}