76 lines
1.7 KiB
Python
76 lines
1.7 KiB
Python
def solution(start, stop, debug=False):
|
|
one = 0
|
|
zero = 0
|
|
length = len(bin(start)) - 2
|
|
|
|
if len(bin(stop)) - 2 == 1 or len(bin(stop)) - 2 == 2:
|
|
return 0
|
|
|
|
for i in bin(start)[2:]:
|
|
if i == '1' and zero == 0:
|
|
one += 1
|
|
elif i == '0':
|
|
zero += 1
|
|
else:
|
|
break
|
|
|
|
# first iteration
|
|
number = '1' * one + '0' * zero + '1' * (length - one - zero)
|
|
counter = 0
|
|
if int(number, 2) == stop:
|
|
return 1
|
|
elif int(number, 2) < stop:
|
|
if len(number) > 3:
|
|
counter += 1
|
|
if debug:
|
|
print(number, int(number, 2))
|
|
else:
|
|
return 0
|
|
|
|
while int(number, 2) < stop:
|
|
zero -= 1
|
|
if zero == 0:
|
|
one += 1
|
|
zero = length - one - 1
|
|
if one >= length - 1:
|
|
length += 1
|
|
one = 1
|
|
zero = length - one - 1
|
|
number = '1' * one + '0' * zero + '1' * (length - one - zero)
|
|
if len(number) < 3:
|
|
continue
|
|
|
|
if number.split('0')[0] != number:
|
|
if debug:
|
|
print(number, int(number, 2))
|
|
counter += 1
|
|
|
|
if int(number, 2) > stop:
|
|
counter -= 1
|
|
|
|
return counter
|
|
|
|
|
|
def test():
|
|
input_data: list[tuple[int, int]] = [
|
|
# (259, 263),
|
|
# (259, 264),
|
|
# (16384, 65536),
|
|
# (16385, 16385),
|
|
# (16385, 16386),
|
|
# (259, 16387),
|
|
(1, 10000000000)
|
|
# (1, 16)
|
|
]
|
|
|
|
for data in input_data:
|
|
print(solution(*data, debug=True))
|
|
|
|
|
|
def main():
|
|
start, stop = map(int, input().split())
|
|
print(solution(start, stop))
|
|
|
|
|
|
test()
|
|
|