結果
| 問題 |
No.3301 Make Right Triangle
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-10-05 16:28:00 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,864 bytes |
| コンパイル時間 | 248 ms |
| コンパイル使用メモリ | 82,288 KB |
| 実行使用メモリ | 76,988 KB |
| 最終ジャッジ日時 | 2025-10-05 16:28:09 |
| 合計ジャッジ時間 | 7,177 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 1 |
| other | TLE * 1 -- * 8 |
ソースコード
# 自作ライブラリ
# https://github.com/takumi-okamoto/competitive-programming-public/tree/main/mylib
import sys
import math
sys.setrecursionlimit(10**8)
def debug(*args):
print(*args, file=sys.stderr)
def solve(l):
if l in [3, 4, 5]:
return "3 4 5"
# a = k(m**2-n**2)
# b = 2kmn
# c = k(m**2 + n**2)
# gcd(m, n) = 1
m = 1
while m * m < l:
# lが素数の場合
# m ** 2 + n ** 2 = l
n2 = l - m * m
n1 = int(n2**0.5)
for d in [-1, 0, 1]:
n = n1 + d
if n * n == n2:
break
else:
n = None
if n is not None:
g = math.gcd(m, n)
k = g**2
m = m // g
n = n // g
if m > n:
return f"{k*(m**2 - n**2)} {2*k*m*n} {k*(m**2+n**2)}"
m += 1
n = 1
while 2 * n * n <= l:
if l % (2 * n) == 0:
m = l // (2 * n)
if m > n:
g = math.gcd(m, n)
m //= g
n //= g
k = g * g
return f"{k*(m**2 - n**2)} {2*k*m*n} {k*(m**2+n**2)}"
n += 1
d = 1
while d * d <= l:
if l % d == 0:
if (l // d - d) % 2 == 0:
n = (l // d - d) // 2
m = 2 * n + d
if m > n:
g = math.gcd(m, n)
m //= g
n //= g
k = g * g
return f"{k*(m**2 - n**2)} {2*k*m*n} {k*(m**2+n**2)}"
d += 1
def main():
t = int(input())
ans = []
for _ in range(t):
ans.append(solve(int(input())))
print(*ans, sep="\n")
# for abc in ans:
# a, b, c = map(int, abc.split())
# assert a**2 + b**2 == c**2
if __name__ == "__main__":
main()