//zju1360 Radar Installation #include <cstdio> #include <algorithm> #include <functional> #include <cmath> using namespace std; #define MAX_N 1000 #define PREC 1e-6 char mark[MAX_N]; struct NODE { double val; long id; inline bool operator< (const NODE& right) const { return val < right.val; } }; NODE left[MAX_N]; NODE right[MAX_N]; int main() { long nCase = 0; long N, d; while (2 == scanf("%ld%ld", &N, &d)) { if (0==N || 0==d) break; double dSqr = (double)(d*d); memset(mark, 0, N*sizeof(mark[0])); bool bNoSolut = false; long n; for (n=0; n<N; n++) { long x, y; scanf("%ld%ld", &x, &y); if (bNoSolut) continue; if (y > d) { bNoSolut=true; continue; } double offset = sqrt(dSqr - (double)(y*y)); left[n].val = x - offset; left[n].id = n; right[n].val = x + offset; right[n].id = n; } long nRadar = -1; if (!bNoSolut) { sort(left, left+N, less<NODE>()); sort(right, right+N, less<NODE>()); nRadar = 0; long iLeft=0, iRight=0; while (1) { double xRadar; for (;iRight<N; iRight++) { if (!mark[ right[iRight].id ]) { nRadar++; xRadar = right[iRight].val; mark[ right[iRight].id ] = 1; iRight++; break; } } if (iRight == N) break; for (;iLeft<N; iLeft++) { double xLeft = left[iLeft].val; if (xLeft < xRadar || (xLeft-xRadar)<PREC) mark[ left[iLeft].id ] = 1; else break; } if (iLeft == N) break; } } printf("Case %ld: %ld/n", ++nCase, nRadar); } return 0; }