Problem:
Score : 300 points

Problem Statement

Given an integer N, find the base -2 representation of N.

Here, S is the base -2 representation of N when the following are all satisfied:

S is a string consisting of 0 and 1.

Unless S = 0, the initial character of S is 1.

Let S = S_k S_{k-1} ... S_0, then S_0 \times (-2)^0 + S_1 \times (-2)^1 + ... + S_k \times (-2)^k = N.

It can be proved that, for any integer M, the base -2 representation of M is uniquely determined.

Constraints

Every value in input is integer.

-10^9 \leq N \leq 10^9

Input

Input is given from Standard Input in the following format:

N

Output

Print the base -2 representation of N.

Sample Input 1

-9

Sample Output 1

1011

As (-2)^0 + (-2)^1 + (-2)^3 = 1 + (-2) + (-8) = -9, 1011 is the base -2 representation of -9.

Sample Input 2

123456789

Sample Output 2

11000101011001101110100010101

Sample Input 3

0

Sample Output 3

0

Solution in Kotlin (1.3.71) (judge verdict: Accepted)

import kotlin.math.pow

fun main() {
    val n = readLine()?.toLong() ?: return
    if (n == 0L) {
        println("0")
        return
    }

    val h = hashMapOf<Long, Long>()
    h[0] = 1
    h[1] = -2
    var s = 0L
    var b = 0L
    var c = 0
    if (n < 0) {
        s = 0L
        b = -2L
        c = 0
        while (s > n) {
            s += b
            h[c + 2L] = h[c.toLong()]!! - (b * 2)
            b *= 4
            c += 2
            h[c - 1L] = s
        }
        s = -(2.0.pow((c - 1).toDouble()).toLong())

    } else {
        s = 1L
        b = 4L
        c = 1
        h[2] = b
        while (s < n) {
            s += b
            h[c + 2L] = h[c.toLong()]!! - (b * 2)
            b *= 4
            c += 2
            h[c - 1L] = s
        }
        s = 2.0.pow((c - 1).toDouble()).toLong()
    }
    buildString {
        append("1")
        (c - 2).downTo(0).forEach {
            val v = 2.0.pow(it.toDouble()).toLong()
            if (s != n) {
                if (it % 2L == 0L) {
                    if (s + v + h.getOrDefault(it - 1L, 0) <= n) {
                        s += v
                        append("1")
                    } else {
                        append("0")
                    }
                } else {
                    if (s - v + h[it - 1L]!! >= n) {
                        s -= v
                        append("1")
                    } else {
                        append("0")
                    }
                }
            } else {
                append("0")
            }
        }
    }.let {
        println(it)
    }
}