我想找到一个无限序列的数字[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],
答案 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),