#include using namespace std; #define sz(x) ((int)x.size()) #define rep(i, a, b) for (int i = (a); i < (b); i++) #define all(x) begin(x), end(x) typedef vector vi; typedef vector> vb; struct Maxclique { //double limit = 0.025, pk = 0; double limit = 0.0025, pk = 0; struct Vertex { int i, d = 0; }; typedef vector vv; vb e; vv V; vector C; vi qmax, q, S, old; void init(vv& r) { for (auto& v : r) v.d = 0; for (auto& v : r) for (auto j : r) v.d += e[v.i][j.i]; sort(all(r), [](auto a, auto b) { return a.d > b.d; } ); int mxD = r[0].d; rep(i, 0, sz(r)) r[i].d = min(i, mxD) + 1; } void expand(vv& R, int lev = 1) { S[lev] += S[lev - 1] - old[lev]; old[lev] = S[lev - 1]; while (sz(R)) { if (sz(q) + R.back().d <= sz(qmax)) return; q.push_back(R.back().i); vv T; for (auto v : R) if (e[R.back().i][v.i]) T.push_back({v.i}); if (sz(T)) { if (S[lev]++ / ++pk < limit) init(T); int j = 0, mxk = 1, mnk = max(sz(qmax) - sz(q) + 1, 1); C[1].clear(), C[2].clear(); for (auto v : T) { int k = 1; auto f = [&](int i) { return e[v.i][i]; }; while (any_of(all(C[k]), f)) k++; if (k > mxk) mxk = k, C[mxk + 1].clear(); if (k < mnk) T[j++].i = v.i; C[k].push_back(v.i); } if (j > 0) T[j - 1].d = 0; rep(k, mnk, mxk + 1) for (int i : C[k]) T[j].i = i, T[j++].d = k; expand(T, lev + 1); } else if (sz(q) > sz(qmax)) qmax = q; q.pop_back(), R.pop_back(); } } vi maxClique() { init(V), expand(V); return qmax; } Maxclique(vb conn) : e(conn), C(sz(e) + 1), S(sz(C)), old(S) { rep(i, 0, sz(e)) V.push_back({i}); } }; const double EPS = 1e-6; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; double r; cin >> n >> r; vector> nodes; for (int i = 1; i < n; i++) for (int j = 1; j < n; j++) if (min({i, j, n - i, n - j}) >= r - EPS) nodes.push_back({i, j}); int N = nodes.size(); vb conn(N); for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) { int dx = abs(nodes[i].first - nodes[j].first); int dy = abs(nodes[i].second - nodes[j].second); if (dx * dx + dy * dy >= r * r * 4 - EPS) conn[i][j] = true; } vi sol; if (r > 1.5 + EPS) { sol = Maxclique(conn).maxClique(); } else { for (int i = 0; i < N; i++) { bool ok = true; for (int j : sol) ok &= conn[i][j]; if (ok) sol.push_back(i); } } cout << sol.size() << '\n'; for (int i : sol) cout << nodes[i].first << ' ' << nodes[i].second << '\n'; }