def is_sum_of_two_squares(m):
"""m = 2**a0 * p1**a1 * ... * pi**ai * q1**(2*b1) * ... * qk**(2*bj)
p: 4*n+1 Pythagorean primes
q: 4*n+3
https://r...content-available-to-author-only...a.org/wiki/%D0%93%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%8B_%D1%86%D0%B5%D0%BB%D1%8B%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%B0#.D0.9F.D0.BE.D0.B4.D1.81.D1.87.D1.91.D1.82_.D1.87.D0.B8.D1.81.D0.BB.D0.B0_.D0.BF.D1.80.D0.B5.D0.B4.D1.81.D1.82.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B9_.D0.B2_.D0.B2.D0.B8.D0.B4.D0.B5_.D1.81.D1.83.D0.BC.D0.BC.D1.8B_.D0.B4.D0.B2.D1.83.D1.85_.D0.BA.D0.B2.D0.B0.D0.B4.D1.80.D0.B0.D1.82.D0.BE.D0.B2
"""
assert m >= 0
if m < 3:
# 0*0 + 0*0 == 0
# 1*1 + 0*0 == 1
# 1*1 + 1*1 == 2
return True
p = 2
while m > 1:
multiplicity = 0
while m % p == 0: # found prime factor
multiplicity += 1
m //= p
if multiplicity & 1: # odd power
if p % 4 == 3: # 4*k+3 form
return False
else:
assert p % 4 == 1 or p == 2
p += 1
return True
def max_sum_of_two_squares_nearest(m):
"""Find maxsum=x*x+y*y such that |maxsum-m| is minimal."""
for i in range(m + 1):
if is_sum_of_two_squares(m + i):
return m + i
elif is_sum_of_two_squares(m - i):
return m - i
assert 0
for m in range(21):
print(m, "->", max_sum_of_two_squares_nearest(m))
print(max_sum_of_two_squares_nearest(int(input())))
ZGVmIGlzX3N1bV9vZl90d29fc3F1YXJlcyhtKToKICAgICIiIm0gPSAyKiphMCAqIHAxKiphMSAqIC4uLiAqIHBpKiphaSAqIHExKiooMipiMSkgKiAuLi4gKiBxayoqKDIqYmopCgoKICAgIHA6IDQqbisxICBQeXRoYWdvcmVhbiBwcmltZXMKICAgIHE6IDQqbiszCgpodHRwczovL3IuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmEub3JnL3dpa2kvJUQwJTkzJUQwJUIwJUQxJTgzJUQxJTgxJUQxJTgxJUQwJUJFJUQwJUIyJUQxJThCXyVEMSU4NiVEMCVCNSVEMCVCQiVEMSU4QiVEMCVCNV8lRDElODclRDAlQjglRDElODElRDAlQkIlRDAlQjAjLkQwLjlGLkQwLkJFLkQwLkI0LkQxLjgxLkQxLjg3LkQxLjkxLkQxLjgyXy5EMS44Ny5EMC5COC5EMS44MS5EMC5CQi5EMC5CMF8uRDAuQkYuRDEuODAuRDAuQjUuRDAuQjQuRDEuODEuRDEuODIuRDAuQjAuRDAuQjIuRDAuQkIuRDAuQjUuRDAuQkQuRDAuQjguRDAuQjlfLkQwLkIyXy5EMC5CMi5EMC5COC5EMC5CNC5EMC5CNV8uRDEuODEuRDEuODMuRDAuQkMuRDAuQkMuRDEuOEJfLkQwLkI0LkQwLkIyLkQxLjgzLkQxLjg1Xy5EMC5CQS5EMC5CMi5EMC5CMC5EMC5CNC5EMS44MC5EMC5CMC5EMS44Mi5EMC5CRS5EMC5CMgogICAgIiIiCiAgICBhc3NlcnQgbSA+PSAwCiAgICBpZiBtIDwgMzoKICAgICAgICAjIDAqMCArIDAqMCA9PSAwCiAgICAgICAgIyAxKjEgKyAwKjAgPT0gMQogICAgICAgICMgMSoxICsgMSoxID09IDIKICAgICAgICByZXR1cm4gVHJ1ZQogICAgcCA9IDIKICAgIHdoaWxlIG0gPiAxOgogICAgICAgIG11bHRpcGxpY2l0eSA9IDAKICAgICAgICB3aGlsZSBtICUgcCA9PSAwOiAgIyBmb3VuZCBwcmltZSBmYWN0b3IKICAgICAgICAgICAgbXVsdGlwbGljaXR5ICs9IDEKICAgICAgICAgICAgbSAvLz0gcAogICAgICAgIGlmIG11bHRpcGxpY2l0eSAmIDE6ICAjIG9kZCBwb3dlcgogICAgICAgICAgICBpZiBwICUgNCA9PSAzOiAgICAjIDQqayszIGZvcm0KICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXNzZXJ0IHAgJSA0ID09IDEgb3IgcCA9PSAyCiAgICAgICAgcCArPSAxCiAgICByZXR1cm4gVHJ1ZQoKCmRlZiBtYXhfc3VtX29mX3R3b19zcXVhcmVzX25lYXJlc3QobSk6CiAgICAiIiJGaW5kIG1heHN1bT14KngreSp5IHN1Y2ggdGhhdCB8bWF4c3VtLW18IGlzIG1pbmltYWwuIiIiCiAgICBmb3IgaSBpbiByYW5nZShtICsgMSk6CiAgICAgICAgaWYgaXNfc3VtX29mX3R3b19zcXVhcmVzKG0gKyBpKToKICAgICAgICAgICAgcmV0dXJuIG0gKyBpCiAgICAgICAgZWxpZiBpc19zdW1fb2ZfdHdvX3NxdWFyZXMobSAtIGkpOgogICAgICAgICAgICByZXR1cm4gbSAtIGkKICAgIGFzc2VydCAwCgpmb3IgbSBpbiByYW5nZSgyMSk6CiAgICBwcmludChtLCAiLT4iLCBtYXhfc3VtX29mX3R3b19zcXVhcmVzX25lYXJlc3QobSkpCgpwcmludChtYXhfc3VtX29mX3R3b19zcXVhcmVzX25lYXJlc3QoaW50KGlucHV0KCkpKSk=