子序列是您可以通过删除任意数量的字符从另一个序列获得的任何序列。的不同的非空的子序列100
是0
,1
,00
,10
,100
。的不同的非空的子序列1010
是0
,1
,00
,01
,10
,11
,010
,100
,101
,110
,1010
。
写一个程序或函数给定一个正整数Ñ返回的二进制展开的不同的非空的子序列的数目Ñ。
例子:因为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