#include <bits/stdc++.h>
using namespace std;
const int inf = (int)1e9;
const double eps = 1e-9;
int n;
struct pnt {
  double first, second;
  pnt() {}
  pnt(double first, double second) : first(first), second(second) {}
};
pnt operator+(pnt a, pnt b) {
  return pnt(a.first + b.first, a.second + b.second);
}
pnt operator-(pnt a, pnt b) {
  return pnt(a.first - b.first, a.second - b.second);
}
pnt operator*(double c, pnt a) { return pnt(c * a.first, c * a.second); }
double sp(pnt a, pnt b) { return a.first * b.first + a.second * b.second; }
double vp(pnt a, pnt b) { return a.first * b.second - a.second * b.first; }
pnt p[1000];
double l[1000];
double a[1000];
struct line {
  double a, b, c;
  line() {}
  line(pnt p, double alp) {
    pnt v = pnt(cos(alp), sin(alp));
    a = -v.second;
    b = v.first;
    c = -(a * p.first + b * p.second);
  }
};
pnt inters(line a, line b) {
  double dd = a.a * b.b - a.b * b.a;
  double dx = a.c * b.b - a.b * b.c;
  double dy = a.a * b.c - a.c * b.a;
  return pnt(-dx / dd, -dy / dd);
}
int main() {
  scanf("%d", &n);
  if (n <= 4) {
    printf("No solution\n");
    return 0;
  }
  for (int i = 0; i < n - 1; i++) {
    l[i] = 800 - i * 0.005;
  }
  p[0] = pnt(0, 0);
  double alp = 2 * M_PI / n;
  for (int i = 0; i < n - 1; i++) {
    p[i + 1] = p[i] + l[i] * pnt(cos(alp * i), sin(alp * i));
  }
  p[n - 1] = inters(line(p[0], -alp), line(p[n - 2], -2 * alp));
  p[n] = p[0];
  for (int i = 0; i < n; i++) {
    l[i] = sqrt(sp(p[i + 1] - p[i], p[i + 1] - p[i]));
    assert(l[i] <= 1000);
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < i; j++) {
      assert(fabs(l[j] - l[i]) > 1e-3);
    }
  }
  for (int i = 0; i < n; i++) {
    a[i] = -atan2(vp(p[i + 1] - p[i], p[i] - p[(i + n - 1) % n]),
                  sp(p[i + 1] - p[i], p[i] - p[(i + n - 1) % n]));
    assert(fabs(a[i] - alp) < 1e-3);
  }
  for (int i = 0; i < n; i++) {
    printf("%.18lf %.18lf\n", (double)p[i].first, (double)p[i].second);
  }
  return 0;
}
