#include <bits/stdc++.h>
using namespace std;
void SR(int &x) { scanf("%d", &x); }
void SR(long long &x) { scanf("%lld", &x); }
void SR(double &x) { scanf("%lf", &x); }
void SR(char *s) { scanf("%s", s); }
void RI() {}
template <typename I, typename... T>
void RI(I &x, T &...tail) {
  SR(x);
  RI(tail...);
}
int n, r;
void read() { RI(n, r); }
struct Point {
  Point() {}
  Point(long long _x, long long _y) : x(_x), y(_y) {}
  long long x, y;
  Point operator-(const Point &b) const { return Point(x - b.x, y - b.y); }
  long long operator*(const Point &b) const { return x * b.x + y * b.y; }
};
vector<Point> v;
void build() {
  for (int a = (0); a <= int(r); a++) {
    int b = 0;
    while (a * a + b * b <= r * r) b++;
    b--;
    v.push_back(Point(a, b));
    v.push_back(Point(a, -b));
  }
}
vector<Point> ans, cur;
long long curv;
void dfs(int k, int ch) {
  if (k == n) {
    long long val = 0;
    for (auto a : ans)
      for (auto b : ans) val += (a - b) * (a - b);
    if (val > curv) curv = val, cur = ans;
    return;
  }
  for (int i = (ch); i <= int(((int)(v).size()) - 1); i++) {
    ans.push_back(v[i]);
    ans.push_back(Point(-v[i].x, v[i].y));
    dfs(k + 2, i);
    ans.pop_back();
    ans.pop_back();
  }
}
clock_t st;
void dfs2(int k, int ch) {
  if (k == n) {
    long long val = 0;
    for (auto a : ans)
      for (auto b : ans) val += (a - b) * (a - b);
    if (val > curv) curv = val, cur = ans;
    return;
  }
  for (int i = (ch); i <= int(((int)(v).size()) - 1); i++) {
    ans.push_back(v[i]);
    if ((clock() - st) > 2.9 * CLOCKS_PER_SEC) break;
    dfs2(k + 1, i);
    ans.pop_back();
    ans.push_back(Point(-v[i].x, v[i].y));
    dfs2(k + 1, i);
    ans.pop_back();
  }
}
void sol() {
  if (n & 1) ans.push_back(Point(0, r));
  dfs(n & 1, 0);
  ans.clear();
  dfs2(0, 0);
  printf("%lld\n", curv / 2);
  for (auto x : cur) printf("%lld %lld\n", x.x, x.y);
}
int main() {
  st = clock();
  read();
  build();
  sol();
  return 0;
}
