#include <bits/stdc++.h>
using namespace std;
int n, r;
bool isValid(int x, int y) { return ((sqrt(x * x + y * y)) <= r); }
struct Point {
 public:
  int x, y;
  Point(int _x, int _y) {
    x = _x;
    y = _y;
  }
  Point() {
    x = 0;
    y = 0;
  }
  bool operator<(const Point &p) const {
    return x < p.x || (x == p.x && y < p.y);
  }
  bool operator==(const Point &p) const { return (x == p.x && y == p.y); }
};
long long cross(const Point &O, const Point &A, const Point &B) {
  return (A.x - O.x) * (long long)(B.y - O.y) -
         (A.y - O.y) * (long long)(B.x - O.x);
}
vector<Point> convex_hull(vector<Point> P) {
  int n = P.size(), k = 0;
  vector<Point> H(2 * n);
  sort(P.begin(), P.end());
  for (int i = 0; i < n; i++) {
    while (k >= 2 && cross(H[k - 2], H[k - 1], P[i]) <= 0) k--;
    H[k++] = P[i];
  }
  for (int i = n - 2, t = k + 1; i >= 0; i--) {
    while (k >= t && cross(H[k - 2], H[k - 1], P[i]) <= 0) k--;
    H[k++] = P[i];
  }
  H.resize(k);
  return H;
}
vector<Point> Create() {
  vector<Point> all;
  for (int x = -r; x <= r; x++)
    for (int y = -r; y <= r; y++)
      if (isValid(x, y)) all.push_back(Point(x, y));
  return convex_hull(all);
}
int bestSum;
vector<Point> bestPoints, points, ch;
void solve(int l, int pos, int sx, int sxx, int sy, int syy) {
  if (pos == n) {
    int sums = n * sxx - sx * sx + n * syy - sy * sy;
    if (sums > bestSum) {
      bestSum = sums;
      bestPoints = points;
    }
  } else {
    for (int i = l; i < ch.size(); i++) {
      points.push_back(ch[i]);
      solve(i, pos + 1, sx + ch[i].x, sxx + ch[i].x * ch[i].x, sy + ch[i].y,
            syy + ch[i].y * ch[i].y);
      points.pop_back();
    }
  }
}
int main() {
  cin >> n >> r;
  ch = Create();
  solve(0, 0, 0, 0, 0, 0);
  cout << bestSum << endl;
  for (int i = 0; i < bestPoints.size(); i++)
    cout << bestPoints[i].x << " " << bestPoints[i].y << endl;
  return 0;
}
