結果
| 問題 |
No.454 逆2乗和
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-04-09 21:02:55 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 38 ms / 2,000 ms |
| コード長 | 1,044 bytes |
| コンパイル時間 | 149 ms |
| コンパイル使用メモリ | 82,792 KB |
| 実行使用メモリ | 54,184 KB |
| 最終ジャッジ日時 | 2025-04-09 21:05:09 |
| 合計ジャッジ時間 | 2,538 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 31 |
ソースコード
import math
def asymptotic_psi1(z):
result = 1.0 / z + 1.0 / (2.0 * z ** 2)
# 漸近展開の項をベルヌーイ数に基づいて追加
terms = [
(1, 6, 3),
(-1, 30, 5),
(1, 42, 7),
(-1, 30, 9),
(5, 66, 11),
(-691, 2730, 13),
(7, 6, 15),
(-3617, 510, 17),
(43867, 798, 19),
(-174611, 330, 21),
]
for numerator, denominator, exponent in terms:
term = (numerator / denominator) / (z ** exponent)
result += term
# 項の絶対値が小さくなりすぎたら打ち切る
if abs(term) < 1e-20:
break
return result
x = float(input())
z = x + 1.0
A = 20.0 # 閾値
if z < A:
K = math.ceil(A - z)
sum_terms = 0.0
for k in range(K):
current_z = z + k
sum_terms += 1.0 / (current_z ** 2)
new_z = z + K
psizK = asymptotic_psi1(new_z)
ans = psizK + sum_terms
else:
ans = asymptotic_psi1(z)
# 小数点以下16桁まで表示
print("{0:.16f}".format(ans))
lam6er