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?

<image>

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

Constraints

* 1 ≤ V ≤ 1000
* 1 ≤ d ≤ 150

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.

Output

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

Example

Input

5 5
50 1
13 13


Output

2
50
8
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#include<math.h>
#define MOD 1001
#define MAX 10001
int fibo[MAX];
int p[MAX];
int getfibo(int n)
{  
	if(n<1)return 1;
	if(fibo[n])return fibo[n];
	return fibo[n]=(getfibo(n-1)+getfibo(n-2))%MOD;
}
int root(int a)
{  
	return p[a]<0?a:(p[a]=root(p[a]));
}
int find(int a,int b)
{
  return root(a)==root(b);
}
void merge(int a,int b)
{  
	p[root(a)]=root(b);
}
int main(void)
{  
	fibo[0]=1;
	fibo[1]=2;
	int a,d,i,j;
	while(scanf("%d%d",&a,&d)==2)
	{    
		memset(p,-1,sizeof(p));
		for(i=1;i<=a;i++)
		{      
			for(j=1;j<=a;j++)
			{
				if(abs(getfibo(i)-getfibo(j))<d)
				{          
					if(!find(i,j))merge(i,j);
				}
			}
		}    
		int b[MAX]={0},res,c=0;
		for(i=1;i<=a;i++)
		{
		  res=root(i);
		  if(!b[res])
		  {        
			  b[res]=1;c++;
		  }
		}
		printf("%d\n",c); 
	}
	return 0;
}