結果
問題 |
No.8031 (物理学)長距離相互作用
|
ユーザー |
|
提出日時 | 2025-04-10 23:47:05 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 92 ms / 10,000 ms |
コード長 | 2,989 bytes |
コンパイル時間 | 381 ms |
コンパイル使用メモリ | 82,828 KB |
実行使用メモリ | 77,248 KB |
最終ジャッジ日時 | 2025-04-10 23:47:08 |
合計ジャッジ時間 | 2,535 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 11 |
ソースコード
import sys import math def solve(): try: a_str = sys.stdin.readline().split() b_str = sys.stdin.readline().split() if not a_str or not b_str or len(a_str) != 8 or len(b_str) != 8: sys.exit(1) except: sys.exit(1) try: a = [float(s) for s in a_str] b = [float(s) for s in b_str] except ValueError: sys.exit(1) pts = [] chg = [] idx = 0 for i in [0, 1]: for j in [0, 1]: for k in [0, 1]: pts.append((i/2.0, j/2.0, k/2.0)) chg.append(a[idx]) idx += 1 idx = 0 for i in [1, 3]: for j in [1, 3]: for k in [1, 3]: pts.append((i/4.0, j/4.0, k/4.0)) chg.append(b[idx]) idx += 1 N = 16 q0 = 0.0 o_idx = 0 tol = 1e-9 if abs(pts[0][0]) < tol and abs(pts[0][1]) < tol and abs(pts[0][2]) < tol: q0 = chg[0] else: sys.exit(1) eta = 2.0 r_cut = 7.0 g_cut = 15.0 v_r = 0.0 r_cut_sq = r_cut**2 n_max = int(math.ceil(r_cut)) + 1 for i in range(-n_max, n_max + 1): for j in range(-n_max, n_max + 1): for k in range(-n_max, n_max + 1): nvx, nvy, nvz = float(i), float(j), float(k) for m in range(N): p = pts[m] q = chg[m] if abs(q) < tol: continue if m == o_idx and i == 0 and j == 0 and k == 0: continue px = p[0] + nvx py = p[1] + nvy pz = p[2] + nvz d_sq = px**2 + py**2 + pz**2 if d_sq < tol**2: continue if d_sq <= r_cut_sq: d = math.sqrt(d_sq) v_r += q * math.erfc(eta * d) / d v_k = 0.0 pi = math.pi v_cell = 1.0 g_max = int(math.sqrt(g_cut)) + 1 for h in range(-g_max, g_max + 1): for k_ in range(-g_max, g_max + 1): for l in range(-g_max, g_max + 1): if h == 0 and k_ == 0 and l == 0: continue hkl_sq = float(h*h + k_*k_ + l*l) if hkl_sq > g_cut: continue g_sq = (2*pi)**2 * hkl_sq if g_sq < tol**2: continue s_cos = 0.0 for j in range(N): p = pts[j] q = chg[j] if abs(q) < tol: continue g_dot = 2*pi * (h*p[0] + k_*p[1] + l*p[2]) s_cos += q * math.cos(g_dot) v_k += (4*pi / g_sq) * math.exp(-g_sq / (4*eta**2)) * s_cos v_s = 0.0 if abs(q0) > tol: v_s = 2 * eta * q0 / math.sqrt(pi) v = v_r + v_k - v_s print(f"{v:.8f}") solve()