AT274の技術だったりなかったり

あっとのTECH LOG

競プロのこととか技術のこととか。たまに日常を書きます。

パナソニックコン2020 C - Sqrt Inequality

問題原文

atcoder.jp

問題要旨

 \sqrt{a} + \sqrt{b} < \sqrt{c} か?

  •   1 \leq a, b, c \leq 10^{9}

解法

絵に書いたような地獄絵図を生んだ問題。反省のために書く。
基本的にはやるだけだけど、テストケースがほぼ完璧に誤差を潰してくる。
なので、式変形して根号の部分をつぶしていく。

まず、入力が必ず正の整数なので、二乗しても大小関係は変わらない。
 \sqrt{a} + \sqrt{b} < \sqrt{c} から、両辺二乗して、
 a + b + 2 × \sqrt{ab} < c を得て、左辺移項して、
  2 × \sqrt{ab} < c - a - b を得る。 この時点で c - a -b が0以下なら答えはNo
さらに両辺二乗して、
  4ab < (c - a - b)^2 となって、これでようやく根号が消えた。

実装

a, b, c = map(int, input().split())

if c - a - b <= 0:
    print('No')

elif 4 * a * b < (c - a - b) ** 2:
    print('Yes')

else:
    print('No')

感想

Writerはりんごさんだったんですが、あまりに簡潔なのに罠が多い問題なので、生きてる次元が違うのかと思いました。