package LeetCode_1680
/**
* 1680. Concatenation of Consecutive Binary Numbers
*https://leetcode.com/problems/concatenation-of-consecutive-binary-numbers/
* 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 10^9 + 7, the result is 505379714.
Constraints:
1 <= n <= 105
* */
class Solution {
/*
* solution: Time:O(n*log(num)), Space:O(1)
* n = 3
1 - 1
2 - 10
3 - 11
123 -> 11011 -->
(1 * 2^4) + (1 * 2^3 + 0 * 2 ^ 2) + (1 * 2^1 + 1 * 2^0)
(1 * 2^4) + (2 * 2^2 + 0 * 2 ^ 2) + (2 * 2^0 + 1 * 2^0)
(1 * 2^4) + (2 + 0) * 2 ^2 + (2 + 1)* 2^0
(1)* 2^4 + (2) * 2^2 + (3)* 2^0
((1)* 2^4 + (2) * 2^2) + (3)* 2^0
((1)* 2^2 + (2)) * 2^2) + (3)* 2^0
(4 + 2) * 2^2 + 3
24 + 3
27
* */
fun concatenatedBinary(n: Int): Int {
var result = 0L
val mod = 1000000007
for (i in 1..n) {
//get the length of binary string of each number
var num = i
var len = 0
while (num > 0) {
len++
num = num shr 1
}
result = ((result.shl(len))+i) % mod
}
return result.toInt()
}
}