ABC183 B問題 Billiards 数学的問題を解く
ABC183 B問題 Billiards という数学的問題を解説します。
2次元平面でビリヤードをしていて、玉がにある時、x軸の壁に一回反射させてからに当てるには、x軸の壁のどの位置に当てたら良いか、x座標を求める問題です。
反射するときに入射角と反射角は等しくなります。
中学校の数学でなんとかなるレベルでした。入射角とか反射角とか懐かしい言葉。
入射角と反射角が等しいので、からx軸に線対称の点と最初の位置を直線で結んで、x軸と交わるところのx座標が答えになります。
その直線の方程式をいったん、と置きます。
傾きは、です。
となります。
次にbを求めるには、xとyにを代入します。
なので、とx軸に線対称の点を結ぶ直線の方程式は、
になります。
あとはとしてを求めます。
ポイントとしては、誤差が減るように割り算の回数を減らすところと、最後にround関数で丸めてあげます。
コードは以下のようになります。
Sx, Sy, Gx, Gy = map(int, input().split()) ans = round(((-Sy * (Sx - Gx)) + (Sx * (Sy + Gy))) / (Sy + Gy), 10) print(ans)