#include <bits/stdc++.h>
using namespace std;
const int K = 20;
struct PT {
  int x, y;
  PT operator-(const PT &b) const { return (PT){x - b.x, y - b.y}; }
  int d2() { return x * x + y * y; }
  bool operator<(const PT &b) const {
    return x * x + y * y > b.x * b.x + b.y * b.y;
  }
};
vector<PT> p, ans_p, tmp;
int a[K];
void dfs(int i2, int k, int n, int &ans) {
  if (!n) {
    int sum = 0;
    for (int i = 0; i < tmp.size(); i++) {
      for (int j = i + 1; j < tmp.size(); j++) {
        sum += (tmp[i] - tmp[j]).d2();
      }
    }
    if (sum > ans) {
      ans = sum;
      ans_p.clear();
      for (int i = 0; i < tmp.size(); i++) ans_p.push_back(tmp[i]);
    }
    return;
  }
  if (i2 == k) return;
  for (int i = 0; i <= n; i++) {
    for (int j = 0; j < i; j++) tmp.push_back(p[i2]);
    dfs(i2 + 1, k, n - i, ans);
    for (int j = 0; j < i; j++) tmp.pop_back();
  }
}
int main() {
  int n, r;
  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) p.push_back((PT){i, j});
    }
  }
  sort(p.begin(), p.end());
  int k = min(K, (int)p.size());
  p.resize(k);
  int ans = 0;
  dfs(0, k, n, ans);
  printf("%d\n", ans);
  for (int i = 0; i < n; i++) printf("%d %d\n", ans_p[i].x, ans_p[i].y);
  return 0;
}
