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 <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <utility>
#include <functional>
#include <sstream>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <climits>
using namespace std;
inline int toInt(string s) { int v; istringstream sin(s); sin >> v; return v;}
template<class T> inline string toStr(T x) { ostringstream sout; sout << x; return sout.str();}
typedef vector<int> vi;
typedef vector<vi>  vvi;
typedef vector<string> vs;
typedef pair<int, int> pii;
typedef long long ll;
#define ALL(a) (a).begin(),(a).end()
#define RALL(a) (a).rbegin(),(a).rend()
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define REP(i,n) FOR(i,0,(n)-1)
const double EPS = 1e-12;
const double PI = acos(-1.0);
const int INF = INT_MAX/10;

struct unionfind {
	vi data, rank;
	// Initialize
	unionfind(int size) {
		REP(i, size) {
			data.push_back(i);
			rank.push_back(0);
		}
	}
	// Find root
	int find(int x) {
		return (data[x] == x) ? x :	data[x] = find(data[x]);
	}
	// Unite
	void unite(int x, int y) {
		x = find(x); y = find(y);
		if(x == y) return;
		if(rank[x] < rank[y]) {
			data[x] = y;
		} else {
			data[y] = x;
			if(rank[x] == rank[y]) rank[x]++;
		}
	}
	// Whether x and y belong to the same set
	bool same(int x, int y) {
		return find(x) == find(y);
	}
};

int main() {
	vi f(1001);
	f[0] = 1;
	f[1] = 2;
	FOR(i, 2, 1000) {
		f[i] = (f[i-1] + f[i-2])%1001;
	}

	int N, d;
	while(cin >> N >> d) {
		unionfind uf(N+1);

		FOR(i, 1, N) {
			FOR(j, i+1, N) {
				if(abs(f[i]-f[j]) < d) {
					uf.unite(i, j);
				}
			}
		}

		int ans = 0;
		vi memo(N+1, 0);
		FOR(i, 1, N) {
			int root = uf.find(i);
			if(memo[root] == 0) {
				memo[root] =1;
				ans++;
			}
		}

		cout << ans << endl;
	}

	return 0;
}