#include <bits/stdc++.h>
using namespace std;
struct point {
  int x, y;
};
struct ConvexHull {
  vector<point> hull;
  int m;
  ConvexHull() : m(0) { hull.clear(); }
  bool ccw(point x, point y, point z) {
    return ((y.x - x.x) * (z.y - x.y) > (y.y - x.y) * (z.x - x.x));
  }
  void MakeHull(int n, vector<point> a) {
    hull.clear();
    if (!n) return;
    int x = 0;
    for (int i = 0; i < n; i++)
      if ((a[i].y == a[x].y) ? a[i].x < a[x].x : a[i].y < a[x].y) x = i;
    swap(a[0], a[x]);
    hull.push_back({a[0].x, a[0].y + 1});
    hull.push_back(a[0]);
    sort(a.begin() + 1, a.begin() + n, [=](point x, point y) {
      return (((x.y - a[0].y) * (y.x - a[0].x)) <
              (x.x - a[0].x) * (y.y - a[0].y));
    });
    m = 1;
    for (int i = 1; i < n; i++) {
      while (!ccw(hull[m - 1], hull[m], a[i]))
        if (m > 1)
          hull.pop_back(), m--;
        else if (i + 1 == n)
          break;
        else
          i++;
      hull.push_back(a[i]);
      m++;
    }
    hull.erase(hull.begin());
  }
};
int n;
int r;
vector<point> v;
ConvexHull cw;
int ma = 0;
vector<point> rez;
void rec(int l, int rem, int s, point r) {
  if (!rem) {
    int d = s * n - r.x * r.x - r.y * r.y;
    if (d > ma) {
      ma = d;
      rez = v;
    }
    return;
  }
  if (l == cw.m) return;
  rec(l + 1, rem, s, r);
  v.push_back(cw.hull[l]);
  r = {r.x + v.back().x, r.y + v.back().y};
  s += v.back().x * v.back().x + v.back().y * v.back().y;
  rec(l, rem - 1, s, r);
  v.pop_back();
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> r;
  for (int i = 0; i * i <= r * r; i++)
    for (int j = 0; j * j + i * i <= r * r; j++) {
      v.push_back({i, j});
      if (i) v.push_back({-i, j});
      if (j) v.push_back({i, -j});
      if (i - j) v.push_back({j, i});
      if (i * j) v.push_back({-i, -j});
    }
  cw.MakeHull(v.size(), v);
  v.clear();
  rec(0, n, 0, {0, 0});
  cout << ma << '\n';
  for (int i = 0; i < n; i++) cout << rez[i].x << ' ' << rez[i].y << '\n';
  return 0;
}
