Автор задачі: | 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:
Якщо x=0, тоді 0 \ | \ y = n \implies y = n. Це дає пару .
Якщо 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)