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 <stdio.h>
#include <math.h>
#include <cctype>

#include <iostream>
#include <vector>
#include <deque>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;

#define rep(i, n) for(int i = 0; i < n; i++)
#define repi(i,l,n) for(int (i)=(int)(l);(i)<(int)(n);(i)++)
#define d_arr(arr, h, w) rep(i,(h) ){ cout << "["; rep(j,(w) ) { cout << (arr)[i][j] << ", "; } cout << "]" << endl;}
#define IN(x,s,g) ((x) >= (s) && (x) < (g))
#define ISIN(x,y,w,h) (IN((x),0,(w)) && IN((y),0,(h)))
#define print(x) printf("%d\n",x);

typedef pair<int ,int> P;


int V,d;
int N=1001;

int par[1001];
int height[1001];
int fibo[1001] = {0};

void init(int v)
{
    par[v] = v;
    height[v] = 0;
}
int find(int v)
{
    if(par[v] == v) {return v;}
    else
    {
        return par[v] = find(par[v]);
    }
}
bool same(int a, int b)
{
    return find(a) == find(b);
}

void unite(int a, int b)
{
    if( height[a] > height[b] ) {
        par[find(b)] = find(a);        
    }
    else{
        par[find(a)] = find(b); 
    }
}
int F(int n) {
    if( n == 0 || n == -1 ) { return 1;}
    if( n == 1 ) { return 2;}

    //if( fibo[n-2] == -2 ) { fibo[n-2] = F(n-2) % N; }
    //if( fibo[n-1] == -2 ) { fibo[n-1] = F(n-1) % N; }

    return fibo[n] =  (fibo[n-1] + fibo[n-2]) % N ; 
}
//int F(int n) { return f(n)%N; }

int main()
{
    rep(i,1001) { fibo[i] = -2; }
    fibo[0] = 1;
    fibo[1] = 2;
    while(cin >> V >> d){
        set<int> s;
        repi(i,1,V+1){ init(i); }
        repi(i,1,V){
            repi(j,i+1,V+1)
            {
                if(abs( F(i)-F(j) ) < d) { unite(i,j); }
            }
        }
        repi(i,1,V+1){ 
             s.insert(find(i));
        } 
        cout << s.size() << endl;
    }
}