#include using namespace std; #define fwd(i, a, n) for (int i = (a); i < (n); i ++) #define rep(i, n) fwd(i, 0, n) #define all(X) begin(X), end(X) #define sz(X) ((int)X.size()) #define st first #define nd second #define pii pair #define vi vector #define ll long long #define pll pair #ifdef LOC auto &operator<<(auto &out, pair a) { return out << "(" << a.st << ", " << a.nd << ")"; } auto &operator<<(auto &out, auto a) { out << "{"; for (auto b : a) out << b << ", "; return out << "}"; } void dump(auto... x) { ((cerr << x << ", "), ...) << '\n'; } #define debug(x...) cerr << "[" #x "]: ", dump(x) #else #define debug(...) 0 #endif typedef vector> vb; struct Maxclique { double limit = 0.010, 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, 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; fwd(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, sz(e)) V.push_back({i}); } }; int32_t main() { ios_base::sync_with_stdio(0), cin.tie(0); int n; cin >> n; string s; cin >> s; rep(i, 3) if (s[sz(s) - 1 - i] == '.') s.push_back('0'); ll r = 0; string t; for (auto c : s) if (isdigit(c)) t.push_back(c); r = stoi(t); vector > verts; ll najw = n * 1000; rep(x, n + 1) rep(y, n + 1) { pll norm = {x, y}; pll kek = {x * 1000, y * 1000}; if (kek.st >= r && kek.st + r <= najw) { if (kek.nd >= r && kek.nd + r <= najw) verts.push_back(make_pair(norm, kek)); } } if (sz(verts) == 0) { cout << "0\n"; return 0; } vb dupa(sz(verts)); rep(i, sz(verts)) rep(j, sz(verts)) if (i != j) { ll xdif = verts[i].nd.st - verts[j].nd.st; ll ydif = verts[i].nd.nd - verts[j].nd.nd; ll dist = xdif * xdif + ydif * ydif; if (dist >= 4 * r * r) { dupa[i][j] = 1; } } Maxclique mc(dupa); vi chuj = mc.maxClique(); cout << sz(chuj) << '\n'; for (auto a : chuj) cout << verts[a].st.st << ' ' << verts[a].st.nd << '\n'; return 0; }