Problem:
有益氏のオーディオルーム

数学者である有益氏の趣味は音楽鑑賞で、家に念願のオーディオルームを作りました。完成したオーディオルームで、友人を招いてお披露目会を開きたいと考えています。全員にできるだけ良い音で聴いてもらいたいので、部屋の中の何か所かで音を計測し、友人たちの位置での音の質を計算するつもりです。

計測点は、下の図の円弧と線分の交点である 1 番から 35 番までの点から選択します。１つの線分上にある点は、オーディオシステムからの距離が 100ｃｍから 500ｃｍまで 100ｃｍずつ離れて並んでいます。１つの円弧状にある点は、もっとも右のもの（1 番から 5 番までの点）から反時計回りに、0°から 180°
の範囲で 30°度刻みに並んでいます。

このような円弧と線分に囲まれた領域内のどこかに友人が居ることになるので、友人の居る位置によっ
て必要な計測点を選択します。友人の位置は、円弧に沿って反時計回りに測った角度とオーディオシス
テムからの距離で与えられます。必要な計測点は以下のように１点か、２点か、４点が選ばれます。

友人がちょうど計測点の位置にいれば、その１点を選びます。この図の例の場合、選ばれるのは 23 番の点です。

友人が円弧（または線分）の上にちょうど乗っていれば、その円弧（または線分）上にある、友人に最も近い２点を選びます。この図の例の場合、選ばれるのは 18 番と 23 番の点です。

友人が円弧と線分によって囲まれた区画の内側（円弧や線分の上ではない）にいれば、区画を作っている４点を選びます。この図の例の場合、選ばれるのは 17、18、22、23 番の点です。

有益氏を助けるために、必要な計測点の番号を求めるプログラムを作成してください。

入力

入力は以下の形式で与えられる。

N
r1 t1
r2 t2
:
rN tN

１行目に友人の数 N (1 ≤ N ≤ 50)が与えられる。続く N 行に、友人の位置が与えられる。友人の位置 ri (100 ≤ ri ≤ 500) はオーディオシステムからの距離を表す整数、ti (0 ≤ ti ≤ 180) は円弧に沿って反時計回りに測った角度を表す整数である。

出力

各友人の位置について、計測点の番号を昇順で１行に出力する。

入出力例

入力例

4
300 120
300 105
250 105
250 90

出力例

23
18 23
17 18 22 23
17 18

Solution in C# (judge verdict: Accepted)

using System;

namespace AOJ.Volume3
{
    public class YuekisAudioRoom
    {
        public static int Main()
        {
            int n = int.Parse(Console.ReadLine());
            for (int i = 0; i < n; i++)
            {
                var input = Console.ReadLine().Split(' ');
                int r = int.Parse(input[0]);
                int t = int.Parse(input[1]);

                if (r % 100 == 0 && t % 30 == 0)
                {
                    // 測定点にいる場合
                    // 距離100の測定点は(t / 30) * 5 + 1
                    // その測定点から100離れる毎に番号が1増える
                    // 増える番号は(r / 100) - 1(距離100は増やす必要がない)
                    // まとめると((t / 30) * 5) + (r / 100)
                    Console.WriteLine((t / 30) * 5 + (r / 100));
                }
                else if (r % 100 == 0)
                {
                    // 円弧上にいる場合
                    int t1 = (int)Math.Floor((decimal)t / 30);
                    int t2 = (int)Math.Ceiling((decimal)t / 30);

                    int ans1 = t1 * 5 + (r / 100);
                    int ans2 = t2 * 5 + (r / 100);

                    Console.WriteLine("{0} {1}", ans1, ans2);
                }
                else if (t % 30 == 0)
                {
                    // 直線上にいる場合
                    int r1 = (int)Math.Floor((decimal)r / 100);
                    int r2 = (int)Math.Ceiling((decimal)r / 100);

                    int ans1 = (t / 30) * 5 + r1;
                    int ans2 = (t / 30) * 5 + r2;

                    Console.WriteLine("{0} {1}", ans1, ans2);
                }
                else
                {
                    // 扇形の中にいる場合
                    int t1 = (int)Math.Floor((decimal)t / 30) * 5;
                    int t2 = (int)Math.Ceiling((decimal)t / 30) * 5;
                    int r1 = (int)Math.Floor((decimal)r / 100);
                    int r2 = (int)Math.Ceiling((decimal)r / 100);

                    int ans1 = t1 + r1;
                    int ans2 = t1 + r2;
                    int ans3 = t2 + r1;
                    int ans4 = t2 + r2;

                    Console.WriteLine("{0} {1} {2} {3}", ans1, ans2, ans3, ans4);
                }
            }

            return 0;
        }
    }
}