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 (judge verdict: Wrong Answer)

#include<stdio.h>
#include<math.h>

#define N 1001

int visited[10000],n,M[N+2][N+2];

void dfs(int u)
{
  int V;
  visited[u]=1;
  for(V=1;V<=n;V++)
    {
      if(M[u][V]==1 && visited[V]==0)
	dfs(V);
    }
}

int main(void)
{
  int V,X,d,i,j,f[10000],count;

  
 for(i=0;i<N+2;i++)
	{
	  for(j=0;j<N+2;j++)
	    {
	      M[i][j]=0;
	    }
	}
 
  while(scanf("%d %d",&V,&d)!=EOF)
    {
      n=V;
      f[0]=1;
      f[1]=1;
      count=0;

      for(i=2;i<=V+1;i++)
	{
	  f[i]=(f[i-1]+f[i-2])%1001;
	}
      //printf("1\n");
      for(i=1;i<=V;i++)
	{
	  for(j=1;j<=V;j++)
	    {
	      X=f[i]-f[j];

	      if(abs(X)<d && i!=j)
		{
		  M[f[i]][f[j]]=1;
		  M[f[j]][f[i]]=1;
		}
	      else
		{
		  M[f[i]][f[j]]=0;
		  M[f[j]][f[i]]=0;
		}
	      //printf("2\n");
	      //printf("%d",M[i][j]);
	    }

	  //printf("\n");
	}

	  for(i=0;i<1002;i++)
	{
	  visited[i]=0;
	}

      for(i=1;i<=V;i++)
	{
	  if(visited[i]!=1)
	    {
	      count++;
	      dfs(i);
	    }
	  //printf("%d\n",count);
	}
      printf("%d\n",count);


    }
  return 0;
}