#include #include #include #include #include #define FOR(a,b,c) for(int a=b;a<=c;a++) #define REP(a,c) for(int a=0;a=c;a--) #define WT while(1) #define GETI(a) scanf("%d", &a) #define BZ(a) memset(a,0,sizeof(a)) #define FILL(a,b) fill(a,a+(sizeof(a)/sizeof(a[0])),b) #define FOREACH(a,b) for(__typeof((b).begin()) a=(b).begin(); a!=(b).end();a++) #define D(args...) //printf(args) using namespace std; int X[10100]; int Y[10100]; int result=0; int N, R; struct para { double first; int second; inline bool operator<(const para & other) const { return first < other.first; } }; para intv[8010]; #define put_pair(nintv,a,b) \ intv[nintv].first=a,intv[nintv].second=b,nintv++ void workfrom(int cpoint) { int nintv=0; //vector > intv; REP(i, N) { double dx = X[i] - X[cpoint]; double dy = Y[i] - Y[cpoint]; double center = atan2(dy, dx); double dist = sqrt(dx*dx+dy*dy); if(dist <= 2*R) { double delta = acos(dist / (2*(double)R + 0.0005)); double lo = center - delta, hi = center + delta; D("%d %d %f %f\n", cpoint, i, (float)delta, (float)dist); put_pair(nintv, lo, -1); put_pair(nintv, hi, 1); put_pair(nintv, lo+2*M_PI, -1); put_pair(nintv, hi+2*M_PI, 1); // intv.push_back(make_pair(lo, -1)); // intv.push_back(make_pair(hi, 1)); // intv.push_back(make_pair(lo + 2*M_PI, -1)); // intv.push_back(make_pair(hi + 2*M_PI, 1)); } } sort(intv,intv+nintv); //sort(intv.begin(), intv.end()); int s=0; REP(i, nintv) { para * it = &intv[i]; //FOREACH(it, intv) { D("C %d %f %d %d\n", cpoint, (float)it->first, it->second, s); s -= it->second; if(s > result) result=s; } } int main() { WT { GETI(N); GETI(R); if(!N) break; REP(i, N) { GETI(X[i]); GETI(Y[i]); } result=0; REP(i, N) workfrom(i); printf("It is possible to cover %d points.\n", result); } return 0; }