dsa-1/1/I.py
2025-05-29 19:24:43 +03:00

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()