Problem:
Problem H: Fibonacci Sets

Fibonacci number f(i) appear in a variety of puzzles in nature and math, including packing problems, family trees or Pythagorean triangles. They obey the rule f(i) = f(i - 1) + f(i - 2), where we set f(0) = 1 = f(-1).

Let V and d be two certain positive integers and be N ≡ 1001 a constant. Consider a set of V nodes, each node i having a Fibonacci label F[i] = (f(i) mod N) assigned for i = 1,..., V ≤ N. If |F(i) - F(j)| < d, then the nodes i and j are connected.

Given V and d, how many connected subsets of nodes will you obtain?

Figure 1: There are 4 connected subsets for V = 20 and d = 100.

Input

Each data set is defined as one line with two integers as follows:

Line 1: Number of nodes V and the distance d.

Input includes several data sets (i.e., several lines). The number of dat sets is less than or equal to 50.

Constraints

1 ≤ V ≤ 1000

1 ≤ d ≤ 150

Output

Output line contains one integer - the number of connected subsets - for each input line.

Sample Input

5 5
50 1
13 13

Output for the Sample Input

2
50
8

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Text;

class TEST{
	static void Main(){
		while(true){
			String s=Console.ReadLine();
			if(s==null)break;
			var d=Array.ConvertAll(s.Split(' '),elem=>int.Parse(elem));
			Sol mySol=new Sol(d[0],d[1]);
			Console.WriteLine(mySol.Ans);
		}
	}
}

class Sol{
	int ans;
	public int Ans{
		get{return ans;}
	}
	
	int V;
	int d;
	const int N=1001;
	int[] F;
	bool[] alive;
	bool[,] ARR;
	int cnt;
	public Sol(int Vin,int din){
		V=Vin;d=din;
		F=new int[V+1];
		F[0]=1;F[1]=2;
		for(int i=2;i<=V;i++)F[i]=(F[i-1]+F[i-2])%N;
		ARR=new bool[V+1,V+1];
		
		for(int i=0;i<=V;i++){ARR[0,i]=ARR[i,0]=ARR[i,i]=false;}
		for(int i=1;i<=V;i++){
			for(int j=i+1;j<=V;j++){
				ARR[i,j]=ARR[j,i]=false;
				if(F[i]>F[j] && F[i]-F[j]<d)ARR[i,j]=ARR[j,i]=true;
				if(F[i]<=F[j] && F[j]-F[i]<d)ARR[i,j]=ARR[j,i]=true;
			}
		}
		alive =new bool[V+1];
		alive[0]=false;
		for(int i=1;i<=V;i++)alive[i]=true;

		ans=0;
		for(int i=1;i<=V;i++){
			if(alive[i]){
				cnt=0;
				DFS(i);
			}
		}
	}
	
	void DFS(int start){
		if(cnt==0)ans++;
		cnt++;
		for(int i=1;i<=V;i++){
			if(ARR[start,i] && alive[i]){
				alive[i]=false;
				DFS(i);
			}
		}
	}
}