#include <bits/stdc++.h>
using namespace std;
struct point {
  int x, y;
} p[1000];
int a[1000], e[1000], tot, n, r, mx, i, j;
const int P[9] = {0, 30, 30, 25, 22, 20, 18, 16, 15};
bool cmp(point a, point b) {
  return (a.x * a.x + a.y * a.y) > (b.x * b.x + b.y * b.y);
}
void dfs(int x, int k) {
  if (x == n + 1) {
    int s = 0;
    for (int i = 1; i < n; i++)
      for (int j = i + 1; j <= n; j++)
        s += ((p[a[i]].x - p[a[j]].x) * (p[a[i]].x - p[a[j]].x)) +
             ((p[a[i]].y - p[a[j]].y) * (p[a[i]].y - p[a[j]].y));
    if (s > mx) {
      for (int i = 1; i <= n; i++) e[i] = a[i];
      mx = s;
    }
    return;
  }
  for (int i = k; i <= tot; i++) a[x] = i, dfs(x + 1, i);
}
int main() {
  scanf("%d%d", &n, &r);
  for (i = 1; i <= r; i++)
    for (j = 1; j <= r; j++)
      if ((i * i + j * j) <= ((r) * (r)) &&
          (i * i + j * j) > ((r - 1) * (r - 1)))
        p[++tot].x = i, p[tot].y = j, p[++tot].x = -i, p[tot].y = j,
        p[++tot].x = i, p[tot].y = -j, p[++tot].x = -i, p[tot].y = -j;
  p[++tot].y = r, p[++tot].y = -r, p[++tot].x = r, p[++tot].x = -r;
  sort(p + 1, p + tot + 1, cmp);
  tot = P[n];
  dfs(1, 0);
  printf("%d\n", mx);
  for (i = 1; i <= n; i++) printf("%d %d\n", p[e[i]].x, p[e[i]].y);
}
