无限序列。无法在1秒内处理答案

时间:2014-12-08 08:02:24

标签: python python-2.7

我想找到一个无限序列的数字[i],但在以下输入中需要很长时间。

  

让我们考虑一个无限的数字序列,这些数字由一个接一个写入的10的递增幂构成。这是序列的开头:110100100010000...您要找出序列的确定位置上的数字。

     

输入   第一行中只有整数N(1≤N≤65535)。 N个左行的第i个包含整数K [i] - 序列中的位置数(1≤K[i]≤231 - 1)。

     

输出   您将输出以空格分隔的N位数0或1。更确切地说,输出的第i个数字将等于上述序列的第Ki个数字。

     

INPUT

4 
3
14
7
6
     

输出

0 0 1 0

这是我的代码

x = input()
a = []
for i in range(x):
    y = input()
    a.append(y)

b = '1'
c = 1
for i in range(100):
    c *= 10
    b += str(c)

for i in range(x):
    print b[a[i]-1],

3 个答案:

答案 0 :(得分:1)

你不应该在这里生成一个完整的字符串,而不是使用一些数学。这里的数字将是:

1
10
100
1000
10000
...

如果你看一下这个系列,你会发现1号位于1,2,4,7,1 ...... 我们可以使用此公式(n^2 - n + 2)/2推广此系列。因此,二次方程式将成为:

(n^2 - n + 2)/2 = i
#or n^2 - n + 2 - 2i

其中i是来自输入的当前索引。

现在,如果任何i b^2 - 4ac的输出是一个完美的正方形,则表示该数字肯定为1,否则它为0.(此处为a的值为1,b为-1,我们可以使用c计算2 - 2*i

from math import sqrt

def solve(i):
    b = -1
    a = 1
    c = 2 - 2 * i
    val = (b**2) - (4*a*c)
    sq = sqrt(val)
    if int(sq) == sq:
        return 1
    return 0

for _ in xrange(input()):
    print solve(input()),

<强>演示:

$ python so.py < foo.txt 
0 0 1 0

答案 1 :(得分:0)

您需要超越问题的基本描述。如果您生成整个字符串,则该字符长度为2 ^ 31个字符(并且您需要达到65536,而不是100)。幸运的是,有一种更好的方法。你真的不需要这个字符串。您只需要一种方法来检查给定索引K[i]处的字符是否为1。

字符串中所有&#34; 1&#34;的位置对应triangular numbers。可以通过

计算n三角形数字
x = n * (n + 1) / 2

通过求解n,我们得到了

n = sqrt(2 * x + 0.25) - 0.5

如果x是三角形数字,那么n将是一个整数,字符串将具有&#34; 1&#34;在那个位置上。否则,&#34; 0&#34;。此外,我们必须使用K[i] - 1,因为问题中的索引是从1开始的。

import math
import sys

f = lambda x: math.sqrt(2.0 * x + 0.25) - 0.5
g = lambda x: f(x) % 1 == 0

inp = map(int, sys.stdin.read().split()[1:])

print(" ".join("1" if g(x-1) else "0" for x in inp))

答案 2 :(得分:0)

这可能需要花费很多时间,因为你正在构建10个上升幂的完整数字序列。如果你分析序列的结构,你可以注意到一些模式。

结合事实sum_ {i = 1} ^ n =(n + 1)* n / 2的模式给出了下一个解决方案,其中函数digit_pow_10可以直接确定位置y中的数字是否为1或0,没有构造完整的序列。如果您需要更多详细信息,请与我联系

import math

def digit_pow_10(y):
    n = int(math.sqrt(0.25+2*y)-0.5)
    diff = y - int(n*(n+1)/2.0)
    if diff == 1 or y == 1:
        return 1
    else:
        return 0

x = input()
for i in range(x):
    y = input()
    a.append(y)

for y in a:
    print digit_pow_10(y),