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 JAVA (judge verdict: Time Limit Exceeded)

import java.util.*;
import java.lang.*;
import java.math.*;
import java.io.*;

import static java.lang.Math.*;
import static java.util.Arrays.*;

public class Main{

	Scanner sc=new Scanner(System.in);

	int INF=1<<28;
	double EPS=1e-9;

	int r, n;
	int[] xs, ys, rs, vs;

	void run(){
		for(;;){
			r=sc.nextInt();
			n=sc.nextInt();
			if((r|n)==0){
				break;
			}
			xs=new int[n];
			ys=new int[n];
			rs=new int[n];
			vs=new int[n];
			for(int i=0; i<n; i++){
				xs[i]=sc.nextInt();
				ys[i]=sc.nextInt();
				rs[i]=sc.nextInt();
				vs[i]=sc.nextInt();
			}
			solve();
		}
	}

	void solve(){
		double[] coss=new double[n];
		double[] sins=new double[n];
		for(int i=0; i<n; i++){
			coss[i]=xs[i]/hypot(xs[i], ys[i]);
			sins[i]=ys[i]/hypot(xs[i], ys[i]);
		}

		boolean[] attacked=new boolean[n];
		for(int t=0;; t++){
			double min=INF;
			int k=-1;
			for(int i=0; i<n; i++){
				if(hypot(xs[i], ys[i])>r+EPS){
					xs[i]-=vs[i]*coss[i];
					ys[i]-=vs[i]*sins[i];
					double hypot=hypot(xs[i], ys[i]);
					if(hypot>r+EPS&&hypot+EPS<min&&!attacked[i]){
						k=i;
						min=hypot;
					}
				}
			}
			/*
			 * debug("k", k);
			 * debug("xs", xs);
			 * debug("ys", ys);
			 * debug("attacked",attacked);
			 */
			if(k==-1){
				break;
			}
			P p=new P(0, 0);
			P q=new P(coss[k]*10000, sins[k]*10000);
			for(int i=0; i<n; i++){
				if(hypot(xs[i], ys[i])>r+EPS
						&&crsCS(new P(xs[i], ys[i]), rs[i], p, q)){
					attacked[i]=true;
				}
			}
		}
		int ans=0;
		for(int i=0; i<n; i++){
			if(!attacked[i]){
				ans++;
			}
		}
		// debug(ans);
		println(""+ans);
	}

	// ツ静シツ閉ェツづ点ツづ個仰猟猟」
	double disSP(P p1, P p2, P q){
		if(p2.sub(p1).dot(q.sub(p1))<EPS)
			return q.sub(p1).abs();
		if(p1.sub(p2).dot(q.sub(p2))<EPS)
			return q.sub(p2).abs();
		return disLP(p1, p2, q);
	}

	// ツ陳シツ静シツづ点ツづ個仰猟猟」
	double disLP(P p1, P p2, P q){
		return abs(p2.sub(p1).det(q.sub(p1)))/p2.sub(p1).abs();
	}

	// ツ円ツづ静シツ閉ェツづ個古ーツ債キツ板サツ津ィ
	boolean crsCS(P c, double r, P p1, P p2){
		return disSP(p1, p2, c)<r+EPS
				&&(r<c.sub(p1).abs()+EPS||r<c.sub(p2).abs()+EPS);
	}

	class P{
		double x, y;

		P(){
			this(0, 0);
		}

		P(double x, double y){
			this.x=x;
			this.y=y;
		}

		P add(P p){
			return new P(x+p.x, y+p.y);
		}

		P sub(P p){
			return new P(x-p.x, y-p.y);
		}

		P mul(double m){
			return new P(x*m, y*m);
		}

		P div(double d){
			return new P(x/d, y/d);
		}

		double abs(){
			return Math.sqrt(abs2());
		}

		double abs2(){
			return x*x+y*y;
		}

		double arg(){
			return Math.atan2(y, x);
		}

		// inner product
		double dot(P p){
			return x*p.x+y*p.y;
		}

		// outer product
		double det(P p){
			return x*p.y-y*p.x;
		}

		P rot90(){
			return new P(-y, x);
		}

		// conjugation
		P conj(){
			return new P(x, -y);
		}
	}

	void debug(Object... os){
		System.err.println(Arrays.deepToString(os));
	}

	void print(String s){
		System.out.print(s);
	}

	void println(String s){
		System.out.println(s);
	}

	public static void main(String[] args){
		// System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
		new Main().run();
	}
}