#include <bits/stdc++.h>
using namespace std;
int N, R;
vector<complex<int> > v, hull;
int hn;
complex<int> minx;
long long cross(complex<int> a, complex<int> b) { return imag(conj(a) * b); }
long long cross(complex<int> a, complex<int> ppp, complex<int> qqq) {
  return cross(ppp - a, qqq - a);
}
bool comp(const complex<int> &a, const complex<int> &b) {
  long long c = cross(minx, a, b);
  if (c) return c > 0;
  return norm(a - minx) < norm(b - minx);
}
int ans, ansind[10];
int run;
int ind[10];
void recurse(int x, int d) {
  int s = 0;
  for (int i = 0; i < d; i++) {
    s += norm(hull[x] - hull[ind[i]]);
  }
  ind[d] = x;
  run += s;
  if (d != N - 1) {
    for (int i = x; i < hn; i++) {
      recurse(i, d + 1);
    }
  } else {
    if (ans < run) {
      ans = run;
      for (int i = 0; i < N; i++) {
        ansind[i] = ind[i];
      }
    }
  }
  run -= s;
  ind[d] = -1;
}
int main() {
  scanf("%d %d", &N, &R);
  for (int i = -R; i <= R; i++) {
    for (int j = -R; j <= R; j++) {
      if (i * i + j * j <= R * R) {
        v.push_back(complex<int>(i, j));
      }
    }
  }
  minx = complex<int>(-R, 0);
  sort(v.begin() + 1, v.end(), comp);
  hull.push_back(v[0]);
  for (vector<complex<int> >::iterator it = v.begin() + 1; it != v.end();
       it++) {
    while (hull.size() >= 2 &&
           cross(hull.back(), hull[hull.size() - 2], *it) >= 0) {
      hull.pop_back();
    }
    hull.push_back(*it);
  }
  hn = hull.size();
  memset(ind, -1, sizeof(ind));
  memset(ansind, -1, sizeof(ansind));
  for (int i = 0; i < hn; i++) {
    recurse(i, 0);
  }
  printf("%d\n", ans);
  for (int i = 0; i < N; i++) {
    complex<int> p = hull[ansind[i]];
    printf("%d %d\n", p.real(), p.imag());
  }
}
