#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <set>
#define _USE_MATH_DEFINES
#include <cmath>

using namespace std;

const int NMAX = 30000;

int n;

//сетка из горизонтальных и вертикальных
void test5() {
  set<int, less<int> > s;
  int n = NMAX; if (n%2!=0) n--;
  cout << n << endl;
  int k=n/2;
  double d = 180.0/(k+1);
  double f=d, l=360-d;
  for(int i=0; i<k; i++) {    
    printf("%0.3f %0.3f\n",f,l);
    int f_i = int(f*1000+0.5);
    int l_i = int(f*1000+0.5);
    s.insert(f_i);
    s.insert(l_i);
    f+=d; l-=d;
  }
  f=90-d/2; l=90+d/2;
  for(int i=0; i<k; i++) {
    int f_i, l_i;
    for(;;) {
      f_i = int(f*1000+0.5);
      l_i = int(f*1000+0.5);
      if (s.count(f_i)>0 || s.count(l_i)>0) {
        f -= 0.001;  l += 0.001;
        if (f<0) f+=360;
      }
      else break;      
    }
    printf("%0.3f %0.3f\n",f,l);
    s.insert(f_i);
    s.insert(l_i);
    f-=d; l+=d;
    if (f<0) f+=360;
  }
}

//по окружности не пересекающиеся 
void test6() {
  int n = NMAX;
  cout << n << endl;
  double d = 360.0 / (2*n);
  double f = 0, l=d;
  for (int i=0; i<n; i++) {
    printf("%0.3f %0.3f\n",f,l);
    f+=2*d; l+=2*d;
  }
}

struct Chord{
   int a,b;
};
Chord chords[NMAX];

struct Point {
  int x,y;
  bool operator < (const Point &r) const {
    if (x<r.x || x==r.x && y<r.y) return true; else return false;
  }
};
set<Point, less<Point> > points; //текущие точки пересечений внутри круга
set<int, less<int> > angles; //текущие координаты концов хорд
const int R=10000; //радиус круга
const double EPS=0.00000001;

//найти точку пересечения двух хорд, если она лежит внутри круга, возвратить её
//приближенно в целых координатах
bool find_intersect_point(int p1, int q1, int p2, int q2, Point &p) {
  //1-я хорда
  double x11 = R*cos(p1/1000.0/180.0*M_PI);
  double y11 = R*sin(p1/1000.0/180.0*M_PI);
  double x12 = R*cos(q1/1000.0/180.0*M_PI);
  double y12 = R*sin(q1/1000.0/180.0*M_PI);
  //2-я хорда
  double x21 = R*cos(p2/1000.0/180.0*M_PI);
  double y21 = R*sin(p2/1000.0/180.0*M_PI);
  double x22 = R*cos(q2/1000.0/180.0*M_PI);
  double y22 = R*sin(q2/1000.0/180.0*M_PI);
  //уравнение 1-й прямой
  double a1,b1,c1;
  a1 = y12-y11;
  b1 = x11-x12;
  c1 = - (a1*x11+b1*y11);
  //уравнение 2-й прямой
  double a2,b2,c2;
  a2 = y22-y21;
  b2 = x21-x22;
  c2 = - (a2*x21+b2*y21);
  //проверка пересечения
  double d = a1*b2-a2*b1;
  if (fabs(d) < EPS) return false; //линии параллельны
  double d1 = c2*b1-c1*b2;
  double d2 = a2*c1-a1*c2;
  double x = d1/d;
  double y = d2/d;
  //проверяем, в круге ли лежит эта точка
  if (x*x+y*y > R*R) return false; //пересекаются, но уже за кругом  
  p.x = (x>0) ? (int)(x+0.5) : -(int)(fabs(x)+0.5);
  p.y = (y>0) ? (int)(y+0.5) : -(int)(fabs(y)+0.5);
  return true;
}

//случайный тест
void rnd_test(int r) {
  srand(r);
  points.clear();
  angles.clear();
  int n = NMAX;
  cout << n << endl;
  for (int i=0; i<n; i++) {
    //полуаем очередную хорду
    for(;;) {
      int a = rand()*rand() % 360000;
      int b = rand()*rand() % 360000;
      //координаты хорды не должны совпадать
      if (a==b) continue;
      //координаты концов не должны ни с чем совпадать
      if (angles.count(a) > 0) continue;
      if (angles.count(b) > 0) continue;
      //точки пересечения с имеющимися хордами не должны совпадать с имеющимися точками пересечения
      int j; Point p;
      for (j=0; j<i; j++) 
        if (find_intersect_point(a,b,chords[j].a,chords[j].b,p))
          if (points.count(p) > 0) break;
      if (j<i) continue;
      //хорда найдена - запоминаем её и информацию о ней
      chords[i].a=a;
      chords[i].b=b;
      angles.insert(a);
      angles.insert(b);
      points.insert(p);
      break;
   }
  printf("%0.3f %0.3f\n", chords[i].a/1000.0, chords[i].b/1000.0);
  }
}


int main (int argc, char *argv[]) {
  if (argc==0) return 1;
  int testnum = atoi(argv[1]);
  switch (testnum) {
   case 5: test5(); break;
   case 6: test6(); break;
   case 7: rnd_test(7777); break;
  };
  return 0;
}
