Edit

【pythonでABC183を解説】B - Billiards

問題概要

問題ページ

問題文

高橋君は \(2\) 次元平面上でビリヤードをしています。\(x\) 軸は壁になっており、球をぶつけると入射角と反射角が等しくなるように球が跳ね返されます。

いま高橋君の球が \((S_x,S_y)\) にあります。ある座標を狙って球を撞くと、球はその座標へ向かって直線的に転がっていきます。

\(x\) 軸で球をちょうど \(1\) 回反射させたのち、\((G_x,G_y)\) を通過させるためには、\(x\) 軸のどこを狙えば良いでしょうか?

制約

  • \(-10^6 \leq S_x, G_x \leq 10^6\)
  • \(0 < S_y, G_y \leq 10^6\)
  • \(S_x \neq G_x\)
  • 入力はすべて整数

問題の考察

数学の比で計算することができる問題。

\(S_x:G_x = S_y:G_y\)

\(S_x \times G_y=G_x \times S_y\)

ACコード

import sys


def solve():
    input = sys.stdin.readline
    mod = 10 ** 9 + 7
    a, b, c, d = list(map(int, input().rstrip('\n').split()))
    if a > c:
        a, b, c, d = c, d, a, b
    print(a + b * (c - a) / (b + d))


if __name__ == '__main__':
    solve()

-Edit
-