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;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _0305
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = RInt();
            int cnt = 0;
            while (cnt < n)
            {
                Console.WriteLine(WAr(GetPos(RArInt())));
                cnt++;
            }
        }

        private static IEnumerable<int> GetPos(int[] v)
        {
            const int R_SPAN = 100;
            const int T_SPAN = 30;

            int r = v[0], t = v[1];

            bool isOnArc = r % R_SPAN == 0;
            bool isOnLineSeg = t % T_SPAN == 0;

            int i = t / T_SPAN;
            int j = r / R_SPAN - 1;

            if (isOnArc && isOnLineSeg)
            {
                yield return GetNum(i, j);
            }
            else if (isOnArc)
            {
                yield return GetNum(i, j);
                yield return GetNum(i + 1, j);
            }
            else if (isOnLineSeg)
            {
                yield return GetNum(i, j);
                yield return GetNum(i, j + 1);
            }
            else
            {
                yield return GetNum(i, j);
                yield return GetNum(i, j + 1);
                yield return GetNum(i + 1, j);
                yield return GetNum(i + 1, j + 1);
            }
        }

        private static int GetNum(int i, int j)
        {
            return (5 * i + j) + 1;
        }

        static string RSt() { return Console.ReadLine(); }
        static int RInt() { return int.Parse(Console.ReadLine().Trim()); }
        static long RLong() { return long.Parse(Console.ReadLine().Trim()); }
        static double RDouble() { return double.Parse(Console.ReadLine()); }
        static string[] RArSt(char sep = ' ') { return Console.ReadLine().Trim().Split(sep); }
        static int[] RArInt(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => int.Parse(e)); }
        static long[] RArLong(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => long.Parse(e)); }
        static double[] RArDouble(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => double.Parse(e)); }
        static string WAr<T>(IEnumerable<T> array, string sep = " ") { return string.Join(sep, array.Select(x => x.ToString()).ToArray()); }
    }
}