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
Solutions
Solution 1: Bit Manipulation
By observing the pattern of number concatenation, we can find that when concatenating to the \(i\)-th number, the result \(ans\) formed by concatenating the previous \(i-1\) numbers is actually shifted to the left by a certain number of bits, and then \(i\) is added. The number of bits shifted is the number of binary digits in \(i\).
The time complexity is \(O(n)\), where \(n\) is the given integer. The space complexity is \(O(1)\).
In Solution 1, we need to calculate the number of binary digits of \(i\) each time, which adds some extra computation. We can use a variable \(\textit{shift}\) to record the current number of bits to shift. When \(i\) is a power of \(2\), \(\textit{shift}\) needs to be incremented by \(1\).
The time complexity is \(O(n)\), where \(n\) is the given integer. The space complexity is \(O(1)\).