[Leetcode解題] 1680. Concatenation of Consecutive Binary Numbers

28 February 2026
medium bit, bit_operations

1680. Concatenation of Consecutive Binary Numbers

題目

1680. Concatenation of Consecutive Binary Numbers

給定一個整數n,要回傳從1到n以二進位相連接起來的數(以十進位表示)

舉例來說,n=3

1 + 10 + 11 = 11011,回傳27

回傳的數字要對$10^9+7$取餘數

解題思路

這題我們可以從餘數定理推出來,我們每次相加,都把當前的數字往左移x位,然後再加上新的值

因為左移是一個乘法運算,加上新值是個加法運算,都能適用於餘數定理,所以我們可以每次再直接取餘數

bit_length

我們在這題會使用的bit_length這個函式來得知要左移幾位,這底層實作是直接去調用CPU的operation像LZCNT(Leading Zero Count)或CLZ(Counting Leading Zeros)

如果透過math.ceiling(math.log2(x))+1就會比較慢

同餘定理

同餘定理就是「在除以 $M$ 的世界裡,先運算再取餘數,等於先取餘數再運算」。這能讓你在數字變得巨大之前,先把縮小它們。

比如加法

\[(a+b) (mod M) = [(a (mod M)) + (b (mod M))]\]

乘法

\[(a \times b) (mod M) = [(a (mod M)) \times (b (mod M))]\]

指數的情況,可以先對底數取餘數再進行指數運算(可由乘法推導)

\[(a^b) (mod M) = [(a (mod M))^b]\]

Python 實作

class Solution:
    def concatenatedBinary(self, n: int) -> int:
        MOD = pow(10, 9) + 7
        ans = 0
        for i in range(1, n+1):
            num_shifts = i.bit_length()
            ans = ans << num_shifts | i
            ans = ans % MOD
        return ans

時間複雜度

$O(n)$