#include <bits/stdc++.h>
using namespace std;
struct Point {
  double x, y;
  Point() : x(0), y(0) {}
  Point(double _x, double _y) : x(_x), y(_y) {}
  bool operator<(const Point &b) const { return tie(x, y) < tie(b.x, b.y); }
  bool operator==(const Point &b) const { return tie(x, y) == tie(b.x, b.y); }
  Point operator+(const Point &b) const { return Point(x + b.x, y + b.y); }
  Point operator-(const Point &b) const { return Point(x - b.x, y - b.y); }
  double operator*(const Point &b) const { return x * b.x + y * b.y; }
  double operator%(const Point &b) const { return x * b.y - y * b.x; }
  Point operator*(const double &b) const { return Point(x * b, y * b); }
  double abs() { return sqrt(abs2()); }
  double abs2() { return x * x + y * y; }
};
long long cross(Point o, Point a, Point b) { return (a - o) % (b - o); }
vector<Point> convex_hull(vector<Point> &pt) {
  sort(pt.begin(), pt.end());
  int top = 0;
  vector<Point> stk(2 * pt.size());
  for (int i = 0; i < (int)pt.size(); i++) {
    while (top >= 2 && cross(stk[top - 2], stk[top - 1], pt[i]) <= 0) top--;
    stk[top++] = pt[i];
  }
  for (int i = pt.size() - 2, t = top + 1; i >= 0; i--) {
    while (top >= t && cross(stk[top - 2], stk[top - 1], pt[i]) <= 0) top--;
    stk[top++] = pt[i];
  }
  stk.resize(top - 1);
  return stk;
}
int N, R;
int ans;
vector<Point> convexP, chp, sol;
int dis2(Point a, Point b) {
  return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}
void DFS(int i, int prv, int val) {
  if (i >= N) {
    if (val > ans) {
      ans = val;
      sol = chp;
    }
    return;
  }
  for (int j = prv; j < (int)convexP.size(); j++) {
    int c = 0;
    for (auto pt : chp) c += (pt - convexP[j]).abs2();
    chp.push_back(convexP[j]);
    DFS(i + 1, j, val + c);
    chp.pop_back();
  }
}
int main() {
  vector<Point> pt;
  cin >> N >> R;
  if (N % 2 == 0) {
    for (int i = 0; i < N / 2; i++) {
      sol.push_back(Point(R, 0));
      sol.push_back(Point(-R, 0));
    }
    for (int i = 0; i < N; i++)
      for (int j = 0; j < i; j++) ans += (sol[i] - sol[j]).abs2();
  } else {
    for (int i = -R; i <= R; i++) {
      for (int j = -R; j <= R; j++) {
        if (i * i + j * j <= R * R) {
          pt.push_back(Point(i, j));
        }
      }
    }
    convexP = convex_hull(pt);
    ans = 0;
    DFS(0, 0, 0);
  }
  cout << ans << endl;
  for (auto p : sol) cout << p.x << " " << p.y << endl;
  return 0;
}
