Підряд - це будь-яка послідовність, яку ви можете отримати від іншої, видаливши будь-яку кількість символів. Відмінні непусті підпослідовності 100
є 0
, 1
, 00
, 10
, 100
. Відмінні непусті підпослідовність 1010
є 0
, 1
, 00
, 01
, 10
, 11
, 010
, 100
, 101
, 110
, 1010
.
Напишіть програму або функцію, яка задає натуральне число n повертає кількість виразних непустих підрядів двійкового розширення n .
Приклад: оскільки 4
є 100
у двійковій формі, і ми побачили, що в ньому було п'ять чітких непорожніх підрядів вище, так f(4) = 5
. Починаючи з n = 1 , послідовність починається:
1, 3, 2, 5, 6, 5, 3, 7, 10, 11, 9, 8, 9, 7, 4, 9, 14, 17, 15, 16, 19, 17, 12
Однак ваша програма повинна працювати на будь-яку n <2 50 дюймів за секунду на будь-якій сучасній машині. Кілька великих прикладів:
f(1099511627775) = 40
f(1099511627776) = 81
f(911188917558917) = 728765543
f(109260951837875) = 447464738
f(43765644099) = 5941674