, , , , .
, , b[p][q] x, b[p] p. , , b[p][q], p , 1 x q, 1.
x=3, , :
p N(p) b[p]
- ---- ----
1 1 a
2 1 b
3 1 c
4 3 a b c
5 5 b c abc
6 9 c abc bcabc
7 17 abc bcabc cabcbcabc
8 31 bcabc cabcbcabc abcbcabccabcbcabc
9 57 cabcbcabc abcbcabccabcbcabc bcabccabcbcabcabcbcabccabcbcabc
: N(p) = N(p-1) + N(p-2) + N(p-3), N(p) - pth- b. p x, N [1, p]. , b b[p][q] .
, x=3, p=9 q=45.
N(6)=9, N(7)=17 N(8)=31. 45>9+17, , b[9][45] b[8][45-(9+17)] = b[8][19].- /,
19>9+5, b[8][19] = b[7][19-(9+5)] = b[7][5]. 5>N(4), 5<N(4)+N(5), b[7][5] = b[5][5-3] = b[5][2].b[5][2] = b[3][2-1] = b[3][1]3 <= x, , b[9][45] - c b[3].
, , p, q, x b x. p N(p) . , .
Python ( , numpy, , ):
def so38509640(b, p, q):
"""
p, q are integers. b is a char sequence of length x.
list, string, or tuple are all valid choices for b.
"""
x = len(b)
if p <= x:
if q != 1:
raise ValueError('q={} out of bounds for p={}'.format(q, p))
return p, b[p - 1]
N = [1] * p
for i in range(x, p):
N[i] = sum(N[i - x:i])
print('N =', N)
if q > N[-1]:
raise ValueError('q={} out of bounds for p={}'.format(q, p))
print('b[{}][{}]'.format(p, q), end='')
while p > x:
offset = 0
for i in range(p - x - 1, p):
if i == p - 1:
raise ValueError('q={} out of bounds for p={}'.format(q, p))
if offset + N[i] >= q:
q -= offset
p = i + 1
print(' = b[{}][{}]'.format(p, q), end='')
break
offset += N[i]
print()
return p, b[p - 1]
so38509640('abc', 9, 45)
N = [1, 1, 1, 3, 5, 9, 17, 31, 57]
b[9][45] = b[8][19] = b[7][5] = b[5][2] = b[3][1]
(3, 'c') # <-- Final answer
, so38509640('abc', 7, 5) :
N = [1, 1, 1, 3, 5, 9, 17]
b[7][5] = b[5][2] = b[3][1]
(3, 'c') # <-- Final answer
, :) , Py2 3, / range.
, . , , - .