#include <bits/stdc++.h>
using namespace std;
const int maxn = 60 * 60;
struct Node {
  int x;
  int y;
  Node() {}
  Node(int sx, int sy) : x(sx), y(sy) {}
  bool operator<(const Node &a) const {
    return x * x + y * y > a.x * a.x + a.y * a.y;
  }
} a[maxn];
int n, r, r2, cnt, s[10], ans[10], anssum;
void Init() {
  cnt = 0;
  for (int i = -r; i <= r; i++)
    for (int j = -r; j <= r; j++)
      if (i * i + j * j <= r2) a[cnt++] = Node(i, j);
}
int Dis(int i, int j) {
  return (a[i].x - a[j].x) * (a[i].x - a[j].x) +
         (a[i].y - a[j].y) * (a[i].y - a[j].y);
}
void DFS(int now, int num) {
  if (num == n) {
    double sum = 0;
    for (int i = 0; i < n; i++)
      for (int j = i + 1; j < n; j++) sum += Dis(s[i], s[j]);
    if (sum > anssum) {
      memcpy(ans, s, sizeof(s));
      anssum = sum;
    }
    return;
  }
  for (int i = now; i < cnt; i++) {
    s[num] = i;
    DFS(i, num + 1);
  }
}
int main() {
  while (scanf("%d%d", &n, &r) != EOF) {
    r2 = r * r;
    Init();
    sort(a, a + cnt);
    cnt = min(cnt, 27);
    anssum = 0;
    DFS(0, 0);
    printf("%d\n", anssum);
    for (int i = 0; i < n; i++) printf("%d %d\n", a[ans[i]].x, a[ans[i]].y);
  }
  return 0;
}
