結果
| 問題 |
No.2358 xy+yz+zx=N
|
| コンテスト | |
| ユーザー |
FromBooska
|
| 提出日時 | 2023-06-24 13:49:57 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,133 bytes |
| コンパイル時間 | 164 ms |
| コンパイル使用メモリ | 82,176 KB |
| 実行使用メモリ | 81,536 KB |
| 最終ジャッジ日時 | 2024-07-01 17:50:50 |
| 合計ジャッジ時間 | 4,285 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 4 TLE * 1 -- * 5 |
ソースコード
# 10**7ということは1周しかできない、2重ループは不可
# 因数分解できる形に変形
# 相加相乗平均、二乗式への式変形
# 3項なら2項にして考察
# 0 <= x <= y <= z <= Nとして考える
# 真ん中全探索y決め打ち
# 1つを固定してあとは因数分解で決めるのでどうだ
def divisors(n):
lower_divisors , upper_divisors = [], []
i = 1
while i*i <= n:
if n % i == 0:
lower_divisors.append(i)
if i != n // i:
upper_divisors.append(n//i)
i += 1
return lower_divisors + upper_divisors[::-1]
def main():
N = int(input())
ans = 0
ans_list = []
for z in range(0, N+1):
# 因数分解形
# (X+z)(Y+z) - z**2 = N
# (X+z)(Y+z) = N+z**2
divs = divisors(N+z**2)
#print('z', z, 'divs', divs)
for d1 in divs:
d2 = (N+z**2)//d1
if d1-z >= 0 and d2-z >= 0:
ans += 1
ans_list.append((d1-z, d2-z, z))
print(len(ans_list))
for X, Y, Z in ans_list:
print(X, Y, Z)
main()
FromBooska