#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-10;
const int inf = 1 << 30;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
int nCase = 0;
struct Point {
  double x, y;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
  void read() { scanf("%lf%lf", &x, &y); }
};
Point operator+(Point A, Point B) { return Point(A.x + B.x, A.y + B.y); }
Point operator-(Point A, Point B) { return Point(A.x - B.x, A.y - B.y); }
Point operator*(Point A, double p) { return Point(A.x * p, A.y * p); }
Point operator/(Point A, double p) { return Point(A.x / p, A.y / p); }
int dcmp(double x) {
  if (fabs(x) < eps) return 0;
  return x < 0 ? -1 : 1;
}
bool operator<(const Point& A, const Point& B) {
  return A.x < B.x || (A.x == B.x && A.y < B.y);
}
bool operator==(const Point& A, const Point& B) {
  return dcmp(A.x - B.x) == 0 && dcmp(A.y - B.y) == 0;
}
double Dot(Point A, Point B) { return A.x * B.x + A.y * B.y; }
double Length(Point A) { return sqrt(Dot(A, A)); }
double Angle(Point A, Point B) {
  return acos(Dot(A, B) / Length(A) / Length(B));
}
double Cross(Point A, Point B) { return A.x * B.y - A.y * B.x; }
double Area2(Point A, Point B, Point C) {
  return fabs(Cross(B - A, C - A) / 2.0);
}
Point Rotate(Point A, double rad) {
  return Point(A.x * cos(rad) - A.y * sin(rad),
               A.x * sin(rad) + A.y * cos(rad));
}
Point Normal(Point A) {
  int L = Length(A);
  return Point(-A.y / L, A.x / L);
}
double DistanceToLine(Point p, Point A, Point B) {
  Point v1 = B - A, v2 = p - A;
  return fabs(Cross(v1, v2)) / Length(v1);
}
double DistanceToSegment(Point p, Point A, Point B) {
  if (A == B) return Length(p - A);
  Point v1 = B - A, v2 = p - A, v3 = p - B;
  if (dcmp(Dot(v1, v2) < 0))
    return Length(v2);
  else if (dcmp(Dot(v1, v3)) > 0)
    return Length(v3);
  else
    return DistanceToLine(p, A, B);
}
bool SegmentProperIntersection(Point A1, Point A2, Point B1, Point B2) {
  double c1 = Cross(A2 - A1, B1 - A1), c2 = Cross(A2 - A1, B2 - A1);
  double c3 = Cross(B2 - B1, A1 - B1), c4 = Cross(B2 - B1, A2 - B1);
  return dcmp(c1) * dcmp(c2) < 0 && dcmp(c3) * dcmp(c4) < 0;
}
int n, r;
pair<int, int> p[3600];
int cnt;
vector<pair<int, int> > ans, tmp;
int maxDis;
bool cmp(pair<int, int>& A, pair<int, int>& B) {
  return A.first * A.first + A.second * A.second >
         B.first * B.first + B.second * B.second;
}
long long calc(pair<int, int>& A, pair<int, int>& B) {
  return (A.first - B.first) * (A.first - B.first) +
         (A.second - B.second) * (A.second - B.second);
}
void dfs(int top) {
  if (tmp.size() == n) {
    long long x = 0LL;
    for (int i = 0; i < n; ++i)
      for (int j = i + 1; j < n; ++j) x += calc(tmp[i], tmp[j]);
    if (x > maxDis) {
      maxDis = x;
      ans = tmp;
    }
    return;
  }
  if (top == cnt) return;
  tmp.push_back(p[top]);
  dfs(top);
  tmp.pop_back();
  dfs(top + 1);
}
int main(int argc, const char* argv[]) {
  cin >> n >> r;
  for (int i = -r; i <= r; ++i)
    for (int j = -r; j <= r; ++j)
      if (i * i + j * j <= r * r) p[cnt++] = pair<int, int>(i, j);
  sort(p, p + cnt, cmp);
  cnt = min(cnt, 150 / n);
  dfs(0);
  cout << maxDis << endl;
  for (int i = 0; i < n; ++i) printf("%d %d\n", ans[i].first, ans[i].second);
  return 0;
}
