#include <bits/stdc++.h>
using namespace std;
struct point {
  int x, y;
};
point operator-(const point &a, const point &b) {
  return {a.x - b.x, a.y - b.y};
}
int cross(const point &a, const point &b) { return a.x * b.y - a.y * b.x; }
vector<point> convex_hull(const vector<point> &points) {
  if ((int)points.size() < 3) return {};
  vector<point> hull(points);
  sort(hull.begin(), hull.end(), [](const point &a, const point &b) {
    if (a.x == b.x) return a.y < b.y;
    return a.x < b.x;
  });
  point p1 = hull[0], p2 = hull.back();
  vector<point> up = {p1}, down = {p1};
  for (int i = 1; i < (int)hull.size(); i++) {
    if (i == (int)hull.size() - 1 || cross(p2 - p1, hull[i] - p1) > 0) {
      while ((int)up.size() >= 2 &&
             cross(up.back() - up[(int)up.size() - 2],
                   hull[i] - up[(int)up.size() - 2]) >= 0) {
        up.pop_back();
      }
      up.push_back(hull[i]);
    }
    if (i == (int)hull.size() - 1 || cross(p2 - p1, hull[i] - p1) < 0) {
      while ((int)down.size() >= 2 &&
             cross(down.back() - down[(int)down.size() - 2],
                   hull[i] - down[(int)down.size() - 2]) <= 0) {
        down.pop_back();
      }
      down.push_back(hull[i]);
    }
  }
  hull.clear();
  for (auto &p : up) hull.push_back(p);
  down.pop_back();
  reverse(down.begin(), down.end());
  down.pop_back();
  for (auto &p : down) hull.push_back(p);
  return move(hull);
}
vector<point> points;
int n, r, mx = 0;
basic_string<int> ans, cur;
void solve(int i, int sum_x, int sum_x_sq, int sum_y, int sum_y_sq, int cost) {
  if ((int)cur.length() == n) {
    if (cost > mx) {
      mx = cost;
      ans = cur;
    }
    return;
  }
  if (i == (int)points.size()) {
    return;
  }
  solve(i + 1, sum_x, sum_x_sq, sum_y, sum_y_sq, cost);
  int x = points[i].x, y = points[i].y, len = (int)cur.length();
  cur += i;
  solve(i, sum_x + x, sum_x_sq + x * x, sum_y + y, sum_y_sq + y * y,
        cost + len * x * x + sum_x_sq - 2 * x * sum_x + len * y * y + sum_y_sq -
            2 * y * sum_y);
  cur.pop_back();
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> r;
  for (int x = -r; x <= r; x++) {
    for (int y = -r; y <= r; y++) {
      if (x * x + y * y <= r * r) {
        points.push_back({x, y});
      }
    }
  }
  points = convex_hull(points);
  solve(0, 0, 0, 0, 0, 0);
  cout << mx << '\n';
  for (auto &i : ans) {
    cout << points[i].x << ' ' << points[i].y << '\n';
  }
  return 0;
}
