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 <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
#include <set>

#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define REP(i,j) FOR(i,0,j)
#define mp std::make_pair

typedef long long ll;
typedef unsigned long long ull;
typedef std::pair<int,int> P;
typedef std::pair<int,P> State;

const int INF = 1001001001;

// S N E W(南北東西)
const int dx[8] = {0, 0, 1, -1, 1, 1, -1, -1}, dy[8] = {1, -1, 0, 0, 1, -1, 1, -1};

const int MOD = 1001;

int fib[1002];

class UnionFind{
public:
    UnionFind(){}
    UnionFind(int n){
        init(n);
    }
    void init(int n){
        REP(i, n){
            parent[i] = i;
            rank[i] = 0;
        }
    }
    int find(int v){
        if(v == parent[v]){return v;}
        return parent[v] = find(parent[v]);
    }
    void unite(int x, int y){
        x = find(x);
        y = find(y);
        if(x == y){return;}

        if(rank[x] > rank[y]){
            parent[y] = x;
        }else{
            parent[x] = y;
            if(rank[x] == rank[y]){rank[y] += 1;}
        }
    }
    bool same(int u, int v){
        return find(u) == find(v);
    }
private:
    int parent[1002], rank[1002];
};

UnionFind uf;

int main(){
    fib[0] = 1;
    fib[1] = 2;
    FOR(i, 2, 1002){fib[i] = (fib[i-1] + fib[i-2]) % MOD;}
    
    int V, d;
    while(std::cin >> V >> d, !std::cin.eof()){
        uf.init(V+1);
        FOR(i, 1, V+1){
            FOR(j, i+1, V+1){
                if(std::abs(fib[i] - fib[j]) < d){uf.unite(i, j);}
            }
        }

        int res = 0;
        FOR(i, 1, V+1){
            if(i == uf.find(i)){res += 1;}
        }

        std::cout << res << std::endl;
    }
}