Kaosar and Count ORz#12436

Kaosar and Count ORz (Розбір)

Автор задачі:

Al_Kaosar

Підготував:

MathModel

Відредагував:

MathModel

Розв'язання

Щоб виконувалася умова побітового OR x \ | \ y = n, потрібно розглядати кожну бітову позицію незалежно. Нехай n_i, x_i, і y_i — це -ті біти чисел і відповідно.

  • Якщо n_i = 0: єдина можливість — це x_i = 0 і y_i = 0. (1 варіант)

  • Якщо n_i = 1: пара (x_i, y_i) може бути (0, 1), (1, 0), або . (3 варіанти)

Нехай — кількість встановлених бітів (population count) у числі . Тоді загальна кількість пар таких, що 0 \le x, y \le n і x \ | \ y = n, дорівнює рівно 3^k. Зауважимо, що обмеження x, y \le n виконується автоматично, оскільки і є підмасками числа .

У задачі вимагається, щоб 1 \le x, y \le n. Тому потрібно виключити випадки, коли x=0 або y=0:

  1. Якщо x=0, тоді 0 \ | \ y = n \implies y = n. Це дає пару .

  2. Якщо y=0, тоді x \ | \ 0 = n \implies x = n. Це дає пару .

Оскільки в усіх наборах входних даних n \ge 1, ці дві пари різні. Отже, від загальної кількості потрібно відняти 2. Остаточна відповідь дорівнює (3^k - 2) \pmod{10^9+7}.

Складність для одного набору входних даних становить O(\log n) завдяки модульному піднесенню до степеня.

for _ in range(int(input())):
    n=int(input())
    k=n.bit_count()
    mod=10**9+7
    print((pow(3,k,mod)-2)%mod)