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++14 (judge verdict: Accepted)

#include <iostream>
#include <vector>
#include <cstdlib>
#include <utility>
#include <algorithm>

using namespace std;

const int N = 1001;
vector<int> F, djset, szset;
//vector<pair<int, pair<int, int>>> G;

int root(int v)
{
    int r = djset[v];
    while (r != djset[r]) r = djset[r];
    djset[v] = r;
    return r;
}

bool same(int v1, int v2)
{
    return (root(v1) == root(v2));
}

void unite(int v1, int v2)
{
    int r[2] = {root(v1), root(v2)};
    if (szset[r[1]] > szset[r[0]]) swap(r[0], r[1]);
    djset[r[1]] = r[0];
    szset[r[0]] += szset[r[1]];
    szset[r[1]] = 0;
}

int main(void)
{
    int V, D;
    F.resize(N);
    F[0] = 2;
    F[1] = 3;
    for (int i = 2; i < N; i++) F[i] = (F[i - 1] + F[i - 2]) % N;
    while (cin >> V >> D)
    {
        djset.resize(V);
        szset.resize(V, 1);
        for (int i = 0; i < V; i++) djset[i] = i;
        for (int i = 0; i < V; i++)
        {
            for (int j = 0; j < V; j++)
            {
                if (abs(F[i] - F[j]) >= D || same(i, j)) continue;
                unite(i, j);
            }
        }
        int ans = 0;
        for (auto i : szset) if (i) ans++;
        cout << ans << endl;
        djset.clear();
        szset.clear();
    }
    return 0;
}