Max of Pythagorean Triple

2 secs 1024 MB
uruzunyaa's icon uruzunyaa

解説

この問題は一種の構築問題です。

AA , BB , CC の値を探索する方法では、時間内に答えを出力する事は出来ません。

そこで、 KK と一致する値が AA である場合について、以下の2つが成り立ちます。

  • BB の値が大きいほど、 CC の値も大きい。
  • BB の値が大きいほど、 CBC-B の値は小さくなる。
  • CC の値は KK よりも大きい。

これは KK と一致する値が BB である場合も同様です。

以上の事から、 C=B+1C=B+1 と仮定し、 A,BA,Bの関係式を立式します。

A2+B2=(B+1)2A^2+B^2=(B+1)^2 となり、式変形をすると以下のようになります。

  • B=A212B= \frac{A^2-1}{2}
  • C=A2+12C= \frac{A^2+1}{2}

しかし AA が奇数の場合については、 B,CB,C ともに整数となりますが、AA が偶数の場合については整数となりません。

そこで同様に C=B+2C=B+2 を仮定します。

  • B=A241B= \frac{A^2}{4}-1
  • C=A24+1C= \frac{A^2}{4}+1

となり、AA が偶数の時 B,CB,C は整数となります。

以上から、KK の偶奇によって処理を分ける事で O(1)O(1) で答えを求める事が出来ます。

ただし、この問題には重要なコーナーケースが存在します。

A=1,2,4A=1,2,4 の場合について考えましょう。

A=1,2A=1,2 に関して、上記の式で計算すると B=0B=0 となってしまいます。これは正整数という条件を満たしておらず、他の値でも条件を満たす事は出来ません。よって NoNo を出力します

A=4A=4 に関して、上記の式で計算すると B=3,C=5B=3,C=5 となります。ABA \leq B である事から、答えは 3,4,53,4,5 の順に出力する必要があります。

C++での実装例は以下の通りです。