import math
def expand(n, numerator, denominator):
# 1回連分数展開して整数部分を返します.
# numerator / (sqrt(n) + denominator)
# = 1 / (sqrt(23) - 4)
# = 1 + 1 / (7 / (sqrt(23) - 3))
# = ret + 1 / (numerator / (sqrt(N) + denominator))
# ret, numerator, denominator : 返り値
ret = 1
_numerator = (n - math.pow(denominator,2)) // numerator
_denominator = -1 * denominator
while True:
_denominator = _denominator - _numerator
if n < pow(_numerator - _denominator, 2):
return ret, _numerator, _denominator
ret = ret + 1
def circulation_list(D):
# [c0;c1,c2,...,ck]を返します.(k:周期)
list = []
list.append(int(math.floor(math.sqrt(D))))
numerator = first_numerator = 1
denominator = first_denominator = -1 * list[0]
while True:
c, numerator, denominator = expand(D, numerator, denominator)
list.append(c)
if numerator == first_numerator and denominator == first_denominator:
return list
def is_square_num(n):
if n == 0:
return 1
i = 1
while i * i <= n:
if i * i == n:
return True
i = i + 1
return False
max = 0
maxD = 2
for D in range(2, 1001):
if is_square_num(D):
continue
list = circulation_list(D)
period = len(list) - 1
if period % 2 == 0:
m = 1
else:
m = 2
list = list[:] + list[1:]
# p,qと添字をそろえる
list = [0] + list[:]
p = [1, list[1]]
q = [0, 1]
for i in range(2, m * period + 1):
p.append(list[i] * p[i - 1] + p[i - 2])
q.append(list[i] * q[i - 1] + q[i - 2])
#print('D = {0} : (x, y) = ({1}, {2})'.format(D, p[-1], q[-1]))
if max < p[-1]:
max = p[-1]
maxD = D
print(maxD)# your code goes here
aW1wb3J0IG1hdGgKCmRlZiBleHBhbmQobiwgbnVtZXJhdG9yLCBkZW5vbWluYXRvcik6CiMgMeWbnumAo+WIhuaVsOWxlemWi+OBl+OBpuaVtOaVsOmDqOWIhuOCkui/lOOBl+OBvuOBme+8jgojIG51bWVyYXRvciAvIChzcXJ0KG4pICsgZGVub21pbmF0b3IpCiMgPSAxIC8gKHNxcnQoMjMpIC0gNCkKIyA9IDEgKyAxIC8gKDcgLyAoc3FydCgyMykgLSAzKSkKIyA9IHJldCArIDEgLyAobnVtZXJhdG9yIC8gKHNxcnQoTikgKyBkZW5vbWluYXRvcikpCiMgcmV0LCBudW1lcmF0b3IsIGRlbm9taW5hdG9yIDog6L+U44KK5YCkCgogICAgcmV0ID0gMQogICAgX251bWVyYXRvciA9IChuIC0gbWF0aC5wb3coZGVub21pbmF0b3IsMikpIC8vIG51bWVyYXRvcgogICAgX2Rlbm9taW5hdG9yID0gLTEgKiBkZW5vbWluYXRvcgogICAgd2hpbGUgVHJ1ZToKICAgICAgICBfZGVub21pbmF0b3IgPSBfZGVub21pbmF0b3IgLSBfbnVtZXJhdG9yCiAgICAgICAgaWYgbiA8IHBvdyhfbnVtZXJhdG9yIC0gX2Rlbm9taW5hdG9yLCAyKToKICAgICAgICAgICAgcmV0dXJuIHJldCwgX251bWVyYXRvciwgX2Rlbm9taW5hdG9yCiAgICAgICAgcmV0ID0gcmV0ICsgMQoKZGVmIGNpcmN1bGF0aW9uX2xpc3QoRCk6CiMgW2MwO2MxLGMyLC4uLixja13jgpLov5TjgZfjgb7jgZnvvI4oazrlkajmnJ8pCgogICAgbGlzdCA9IFtdCiAgICBsaXN0LmFwcGVuZChpbnQobWF0aC5mbG9vcihtYXRoLnNxcnQoRCkpKSkKICAgIG51bWVyYXRvciA9IGZpcnN0X251bWVyYXRvciA9IDEKICAgIGRlbm9taW5hdG9yID0gZmlyc3RfZGVub21pbmF0b3IgPSAtMSAqIGxpc3RbMF0KICAgIHdoaWxlIFRydWU6CiAgICAgICAgYywgbnVtZXJhdG9yLCBkZW5vbWluYXRvciA9IGV4cGFuZChELCBudW1lcmF0b3IsIGRlbm9taW5hdG9yKQogICAgICAgIGxpc3QuYXBwZW5kKGMpCiAgICAgICAgaWYgbnVtZXJhdG9yID09IGZpcnN0X251bWVyYXRvciBhbmQgZGVub21pbmF0b3IgPT0gZmlyc3RfZGVub21pbmF0b3I6CiAgICAgICAgICAgIHJldHVybiBsaXN0CgpkZWYgaXNfc3F1YXJlX251bShuKToKICAgIGlmIG4gPT0gMDoKICAgICAgICByZXR1cm4gMQoKICAgIGkgPSAxCiAgICB3aGlsZSBpICogaSA8PSBuOgogICAgICAgIGlmIGkgKiBpID09IG46CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgaSA9IGkgKyAxCgogICAgcmV0dXJuIEZhbHNlCgptYXggPSAwCm1heEQgPSAyCmZvciBEIGluIHJhbmdlKDIsIDEwMDEpOgogICAgaWYgaXNfc3F1YXJlX251bShEKToKICAgICAgICBjb250aW51ZQoKICAgIGxpc3QgPSBjaXJjdWxhdGlvbl9saXN0KEQpCiAgICBwZXJpb2QgPSBsZW4obGlzdCkgLSAxCiAgICBpZiBwZXJpb2QgJSAyID09IDA6CiAgICAgICAgbSA9IDEKICAgIGVsc2U6CiAgICAgICAgbSA9IDIKICAgICAgICBsaXN0ID0gbGlzdFs6XSArIGxpc3RbMTpdCiAgICAjIHAsceOBqOa3u+Wtl+OCkuOBneOCjeOBiOOCiwogICAgbGlzdCA9IFswXSArIGxpc3RbOl0KCiAgICBwID0gWzEsIGxpc3RbMV1dCiAgICBxID0gWzAsIDFdCiAgICBmb3IgaSBpbiByYW5nZSgyLCBtICogcGVyaW9kICsgMSk6CiAgICAgICAgcC5hcHBlbmQobGlzdFtpXSAqIHBbaSAtIDFdICsgcFtpIC0gMl0pCiAgICAgICAgcS5hcHBlbmQobGlzdFtpXSAqIHFbaSAtIDFdICsgcVtpIC0gMl0pCgogICAgI3ByaW50KCdEID0gezB9IDogKHgsIHkpID0gKHsxfSwgezJ9KScuZm9ybWF0KEQsIHBbLTFdLCBxWy0xXSkpCiAgICBpZiBtYXggPCBwWy0xXToKICAgICAgICBtYXggPSBwWy0xXQogICAgICAgIG1heEQgPSBECgpwcmludChtYXhEKSMgeW91ciBjb2RlIGdvZXMgaGVyZQ==