#include <bits/stdc++.h>
using namespace std;
int n;
vector<double> x;
vector<double> radius;
vector<int> s;
void relax(int i, int j) {
  int t = s[j];
  radius[i] = min(radius[i], (x[i] - x[j]) * (x[i] - x[j]) / (4 * radius[t]));
}
const double EPS = 1e-9;
vector<double> p;
double solve(int botva) {
  radius.clear();
  s.clear();
  double sum = 0;
  for (int i = 0; i < n; i++) {
    radius.push_back(p[i]);
    for (int j = 0; j < ((int)(s).size()) && j < botva; j++) {
      relax(i, ((int)(s).size()) - j - 1);
    }
    while (!s.empty() && radius[s.back()] <= radius[i] + EPS) {
      s.pop_back();
    }
    s.push_back(i);
    sum += radius[i];
  }
  fprintf(stderr, "%.4lf\n", radius[n - 1]);
  return sum;
}
int main() {
  n = 500;
  x.resize(0);
  p.resize(0);
  x.push_back(0);
  p.push_back(5e5);
  const double FFR = 500;
  double cx = 1e5, cr = FFR;
  x.push_back(cx);
  p.push_back(cr);
  for (int i = 2; i < n - 1; i++) {
    double maxd = sqrt(4 * cr * cr);
    assert(maxd > 1);
    int nx = (int)(cx + maxd - EPS);
    x.push_back(nx);
    p.push_back(FFR);
    cr = (nx - cx) * (nx - cx) / (4 * cr);
    cx = nx;
  }
  x.push_back(1e6);
  p.push_back(1e6);
  assert(((int)(x).size()) == n);
  assert(((int)(p).size()) == n);
  double d = solve(300);
  d -= solve(1000);
  fprintf(stderr, "d=%.2lf\n", d);
  if (d > 2) {
    printf("%d\n", n);
    for (int i = 0; i < n; i++)
      printf("%d %d\n", (int)(x[i] + 0.4), (int)(p[i] + 0.4));
  }
  return 0;
}
