Concatenation of Consecutive Binary Numbers

  26 Dec 2020

By Wen Xu

tail recursion

Description

Given an integer n, return the decimal value of the binary string formed by concatenating the binary representations of 1 to n in order, modulo 109 + 7.

Example 1:

Input: n = 1 Output: 1 Explanation: “1” in binary corresponds to the decimal value 1. Example 2:

Input: n = 3 Output: 27 Explanation: In binary, 1, 2, and 3 corresponds to “1”, “10”, and “11”. After concatenating them, we have “11011”, which corresponds to the decimal value 27. Example 3:

Input: n = 12 Output: 505379714 Explanation: The concatenation results in “1101110010111011110001001101010111100”. The decimal value of that is 118505380540. After modulo 109 + 7, the result is 505379714.

Constraints:

1 <= n <= 105

Solution

The idea is if we know the answer for n -1, we can construct the answer for n. Let the answer for n - 1 be f(n-1). Then f(n) = f(n-1)*2d+n where d is number of digit in binary representation of n.

We can write this recursively. Since it is tail recursion, we can rewrite it iteratively. Below is the implementation

class Solution:
    def concatenatedBinary(self, n: int) -> int:
        mod = 1000000000 + 7
        ret = 0
        for i in range(1, n + 1):
            t = i
            count = 0
            while t > 0:
                t >>= 1
                count += 1
            ret = ((1 << count) * ret + i) % mod
        return ret		
comments powered by Disqus