#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:128000000")
int n, r, rr;
inline int sqr(int x) { return x * x; }
inline int sdist(int x1, int y1, int x2, int y2) {
  return sqr(x1 - x2) + sqr(y1 - y2);
}
vector<pair<int, int> > p;
int best;
int cur;
vector<int> ans;
vector<int> a;
vector<vector<int> > D;
int maxd;
int FT;
void rec(int x, int y) {
  if (x == n) {
    if (cur > best) {
      best = cur;
      ans = a;
    }
    return;
  }
  int dif = cur + maxd * (((x + n - 1) * (n - x)) >> 1);
  if (dif <= best) return;
  int tcur = cur;
  int lim = (int)p.size();
  if (x < FT) lim = y + 1;
  for (int i = y; i < lim; ++i) {
    int cc = 0;
    for (int j = 0; j < (int)a.size(); ++j) cc += D[i][a[j]];
    cur = tcur + cc;
    a.push_back(i);
    rec(x + 1, i);
    a.pop_back();
  }
  cur = tcur;
}
void print_shit() {
  vector<pair<int, int> > ans;
  for (int i = 0; i < n / 2; ++i) {
    ans.push_back(pair<int, int>(-r, 0));
  }
  for (int i = n / 2; i < n; ++i) {
    ans.push_back(pair<int, int>(r, 0));
  }
  int res = 0;
  for (int i = 0; i < (int)ans.size(); ++i) {
    for (int j = i + 1; j < (int)ans.size(); ++j) {
      res += sdist(ans[i].first, ans[i].second, ans[j].first, ans[j].second);
    }
  }
  cout << res << endl;
  for (int i = 0; i < (int)ans.size(); ++i)
    cout << ans[i].first << " " << ans[i].second << endl;
  exit(0);
}
int main() {
  best = -1;
  cin >> n >> r;
  rr = sqr(r);
  maxd = (rr << 2);
  p.clear();
  FT = 0;
  if (n > 5) FT = 1;
  if (n == 5 && r > 20) FT = 1;
  if (n == 8 && r > 8) print_shit();
  if (n == 7) {
    if (r > 15) FT = 2;
  }
  for (int i = -r; i <= r; ++i) {
    int mr = 0;
    for (int j = 1; j <= r; ++j) {
      int cd = sqr(i) + sqr(j);
      if (cd > rr) break;
      mr = j;
    }
    p.push_back(pair<int, int>(i, mr));
    if (mr) p.push_back(pair<int, int>(i, -mr));
  }
  D.resize((int)p.size());
  sort(p.begin(), p.end());
  for (int i = 0; i < (int)D.size(); ++i) {
    D[i].resize((int)p.size());
    for (int j = 0; j < (int)p.size(); ++j) {
      D[i][j] = sdist(p[i].first, p[i].second, p[j].first, p[j].second);
    }
  }
  rec(0, 0);
  cout << best << endl;
  for (int i = 0; i < n; ++i) {
    cout << p[ans[i]].first << " " << p[ans[i]].second << endl;
  }
  return 0;
}
