※競プロの問題というよりただの計算問題です。ごめんなさい。(ゲームとかを作るならこういう問題をたくさん解く必要があるので、解けたら嬉しい問題だとは思います)

追記(2021-12-20 23:21 JST): と思ったけど AtCoder Regular Contest で既出のようなのでやっぱり競プロの問題です。報告ありがとうございます。


ぱっと見 である場合などには写真が額縁に収まらない気がするかもしれませんが、極端な例を考えてみるとそうではないことが分かります。

写真を角 だけ傾けたとき、傾いていない長方形のうち写真を覆うもので縦と横の長さがともに最小のもの(点線の長方形)の寸法は下図のようになるため

この問題は以下の 2 条件を満たす の範囲に存在するかどうか判定する問題となります。

三角関数の合成を行って整理すると、この条件は を満たす正の最小の角度 を用いて

と書けますから、それぞれの条件を満たす の範囲を求めて共通部分があるか判定すればよいです。

数値計算による誤差には注意してください。特にぴったり または 傾けたときにしか額縁に収まらない場合(額縁と写真で長さが一致している辺がある場合)などには条件を満たす の範囲が一点となって誤差による誤答が発生することがあるので、そのような答えが簡単に求まる場合には条件分岐によって先に答えを出力してプログラムを終了すると安全です。


条件を満たす の求め方を以下に記します(2 本の条件式がありますが、どちらの条件を満たす の範囲も全く同じ方法で求まるのでここでは上の方の条件についてのみ書きます)。式を簡潔にするため とおきます。

まず、三角関数の性質から は常に満たされるため である場合は の範囲全体で条件が満たされます。以下、 である場合を考えます。

各言語の標準ライブラリにある逆三角関数やニュートン法などを用いて を満たす正の最小の を求めます(この正の最小の値を特に と呼びます)。

三角関数の性質から となるため、 とおくと を満たします。

のグラフの概形に を書き込むと下図のようになり、 の範囲で を満たすのは

の 2 つの区間です。

以上から、求めたかった を満たす の範囲は(上記の の区間の上端と下端を だけずらし、 との共通部分をとって)

の 2 つであることが分かりました( の値によっては片方または両方の範囲が空となることに注意してください)。