为什么我总是少计算一个

时间:2016-01-07 20:22:12

标签: python algorithm

我在Codeforce中解决了problem,这是我之前的提交

#!/usr/local/bin/python

limit = 10**18
string = raw_input()
year1, year2 = string.split()
year1 = int(year1)
year2 = int(year2)
x = 1
count = 0
a = []
while True:
    k = 2**x - 1

    if k > limit:
        break
    else:
        for i in xrange(len(bin(k)[2:])):
            if year1 <= k - (1 << i) <= year2 and len(bin(k - (1 << i))[2:].split('0')) == 2:
                count += 1
    x += 1
print count

它适用于所有给定的值,但它为11000000000000000000的范围提供了少一个计数值。它很难调试,因此我在最后print之前添加了一个被黑客攻击的代码

if year2 - year1 + 1 == limit:
    count += 1

并且它适用于该值,但又为另一个范围1再次为935829385028502935提供了一个较小的值。

难怪没有逻辑的黑客没有工作,但我想知道为什么它之前的计数值少了

2 个答案:

答案 0 :(得分:3)

您需要将limit再增加一个数量级:

limit = 10**19

否则,您将错过从864691128455135231获得的1152921504606846975 - (1 << 58)

(观察1152921504606846975 > 10**18。)

答案 1 :(得分:2)

我尝试简化代码(现在可以使用,已接受):

{{1}}

提交:http://codeforces.com/contest/611/submission/15230069