Problem:
UFO 撃墜作戦

40XX 年、地球は宇宙人の侵攻を受けていた!すでに地球のほとんどは宇宙人により制圧されており、残る防衛拠点は鶴ヶ城要塞のみになってしまった。その鶴ヶ城要塞にも、制圧部隊が次々に迫ってきている。

しかし、希望は残されている。防衛軍の最終兵器、超長距離貫通レーザー砲が完成したのだ。欠点といえば、 威力が出るまでに一定の距離が必要で、 近すぎる敵はただ通りぬけてしまうということだ。 威力が出ない範囲に侵入した敵は、他の戦力でどうにかするしかない。防衛軍の参謀は、侵入して来た UFO に対処するために、その数を知らなければならないのだが、あまりにも敵が多いせいでうまく数えられそうにない。そこで参謀はあなたに、レーザーに撃墜されなかった UFO の数を出力するプログラムを用意するように命令した。戦闘開始までにプログラムを作成し、鶴ヶ城要塞を守る力となろう。

敵の UFO はただまっすぐにレーザー砲のある拠点を目指して突撃してくる(UFO には互いにすり抜ける処理が施されており、衝突してしまうことはない) 。レーザー砲は、初期状態から 1 分後に最も近い UFO の中心を狙ってレーザーを発射し始め、それから 1 分ごとに同じ条件でレーザーを発射し続ける。レーザーは貫通し、その先にある UFO もレーザーがかすっただけで撃墜することができる。しかし、このレーザーには威力の出ない範囲があり、その範囲に入ってしまったUFO は狙っても意味がないため、狙わないように設計されている。撃墜できるだけ撃墜したとき、レーザーの威力が出ない範囲には何機の UFO が侵入しただろうか。

レーザーの威力が出ない範囲の半径 R と、襲来する UFO の情報を入力とし、撃墜されず侵入している UFO が何機いるかを出力するプログラムを作成してください。 襲来する UFO の情報は、UFO の数 N 、各 UFO の初期座標 (x0, y0)、各 UFO の半径 r 、各 UFO の分速 v で構成されます。

座標の原点 (0 , 0) をレーザー砲の位置とします。レーザー砲と UFO の距離は原点から UFO の中心までの距離で与えられ、この距離が R 以下の UFO はレーザーの威力が出ない範囲に入ったとします。狙うべき対象が同時に複数存在する場合はないものとして考えます。計算は全て平面上で考え、入力はすべて整数で与えられます。

Input

複数のデータセットの並びが入力として与えられます。 入力の終わりはゼロふたつの行で示されます。
各データセットは以下の形式で与えられます。

R N
x01 y01 r1 v1
x02 y02 r2 v2
:
x0N y0N rN vN

1 行目にレーザーの威力が出ない範囲の半径 R (1 ≤ R ≤ 500) とUFO の数 N (1 ≤ N ≤ 100) が与えられます。続く N 行に i 機目の UFO の情報 x0i, y0i (-100 ≤ x0i, y0i ≤ 1000), ri, vi (1 ≤ ri, vi ≤ 500) が与えられます。

データセットの数は 50 を超えません。

Output

入力データセットごとに、レーザーの威力が出ない範囲に侵入した UFO の数を1行に出力します。

Sample Input

100 5
101 101 5 5
110 110 2 3
-112 -100 9 11
-208 160 82 90
-110 108 10 2
10 11
15 0 5 1
25 0 5 1
35 0 5 1
45 0 5 1
55 0 5 1
65 0 5 1
75 0 5 1
85 0 5 1
95 0 5 1
-20 0 5 20
-30 0 500 5
0 0

Output for the Sample Input

1
1

Solution in C# (judge verdict: Time Limit Exceeded)

using System;

enum Stat { ALIVE, DESTROYED, INVADE }

class Vector2 {
    public float X { get; private set; }
    public float Y { get; private set; }
    public Vector2(float x, float y) { X = x; Y = y; }
    public Vector2(Vector2 v) { X = v.X; Y = v.Y; }
    public float Size { get { return (float)Math.Sqrt(X * X + Y * Y); } }
    public float Sin { get { return Y / Size; } }
    public float Cos { get { return X / Size; } }
    public static Vector2 operator+ (Vector2 v1, Vector2 v2) { return new Vector2(v1.X + v2.X, v1.Y + v2.Y); }
}

class UFO {
    private Stat s;
    public Vector2 Pos { get; private set; }
    private Vector2 v;
    private float r;
    public UFO(float x0, float y0, float ir, float iv) {
        s = Stat.ALIVE;
        Pos = new Vector2(x0, y0);
        v = new Vector2(-iv * Pos.Cos, -iv * Pos.Sin);
        r = ir;
    }
    public void Move(Turret t) {
        Pos += v;
        if (Pos.Size <= t.R) s = Stat.INVADE;
    }
    public bool IsStat(Stat st) {
        return s == st;
    }
    //Runtime Errored
    public void HitJ(Turret t) {
        //float dU2B = Math.Abs(t.Beam.Y * Pos.X - t.Beam.X * Pos.Y) / t.Beam.Size;
        //s = Stat.INVADE;
        if (Math.Abs(t.Beam.Y * Pos.X - t.Beam.X * Pos.Y) / t.Beam.Size <= r) return;
    }
}

class Turret {
    public Vector2 Beam { get; private set; }
    public float R { get; private set; }
    public Turret(float r) {
        R = r;
    }
    public void Search(UFO[] UFOs) {
        float mn = float.MaxValue;
        for (int i = 0; i < UFOs.Length; i++)
            if (UFOs[i].IsStat(Stat.ALIVE) && UFOs[i].Pos.Size < mn) {
                mn = UFOs[i].Pos.Size;
                Beam = UFOs[i].Pos;
            }
        Beam = new Vector2(Beam);
    }
}

class _0204 {
    private static bool CJudge(UFO[] us) {
        for (int i = 0; i < us.Length; i++)
            if (us[i].IsStat(Stat.ALIVE))
                return true;
        return false;
    }
    public static void Main() {
        string str;
        int i, n, c;

        Turret t;
        UFO[] us;
        float[] ps;

        while((str = Console.ReadLine()) != "0 0") {
            t = new Turret(float.Parse(str.Split()[0]));
            n = int.Parse(str.Split()[1]);
            us = new UFO[n];
            for(i = 0; i < n; i++) {
                ps = Array.ConvertAll(Console.ReadLine().Split(), s => float.Parse(s));
                us[i] = new UFO(ps[0], ps[1], ps[2], ps[3]);
            }
            while (CJudge(us)) {
                for (i = 0; i < n; i++) if (us[i].IsStat(Stat.ALIVE)) us[i].Move(t);
                t.Search(us);
                for (i = 0; i < n; i++) if (us[i].IsStat(Stat.ALIVE)) us[i].HitJ(t);
            }
            c = 0;
            for (i = 0; i < n; i++) if (us[i].IsStat(Stat.INVADE)) c++;
            Console.WriteLine(c);
        }
    }
}