#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
long long powmod(long long a, long long b) {
  long long res = 1;
  a %= mod;
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
const double eps = 1e-8;
const double pi = acos(-1.0);
const double inf = 1e20;
const int maxp = 1111;
int dblcmp(double d) {
  if (fabs(d) < eps) return 0;
  return d > eps ? 1 : -1;
}
inline double sqr(double x) { return x * x; }
struct point {
  double x, y;
  point() {}
  point(double _x, double _y) : x(_x), y(_y){};
  void input() { scanf("%lf%lf", &x, &y); }
  void output() { printf("%.10f %.10f\n", x, y); }
  bool operator==(point a) const {
    return dblcmp(a.x - x) == 0 && dblcmp(a.y - y) == 0;
  }
  bool operator<(point a) const {
    return dblcmp(a.x - x) == 0 ? dblcmp(y - a.y) < 0 : x < a.x;
  }
  double len() { return sqrt(x * x + y * y); }
  double len2() { return x * x + y * y; }
  double distance(point p) {
    return sqrt((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y));
  }
  point add(point p) { return point(x + p.x, y + p.y); }
  point sub(point p) { return point(x - p.x, y - p.y); }
  point mul(double b) { return point(x * b, y * b); }
  point div(double b) { return point(x / b, y / b); }
  double dot(point p) { return x * p.x + y * p.y; }
  double det(point p) { return x * p.y - y * p.x; }
  double rad(point a, point b) {
    point p = *this;
    return fabs(atan2(fabs(a.sub(p).det(b.sub(p))), a.sub(p).dot(b.sub(p))));
  }
  point trunc(double r) {
    double l = len();
    if (!dblcmp(l)) return *this;
    r /= l;
    return point(x * r, y * r);
  }
  point rotleft() { return point(-y, x); }
  point rotright() { return point(y, -x); }
  point rotate(point p, double angle) {
    point v = this->sub(p);
    double c = cos(angle), s = sin(angle);
    return point(p.x + v.x * c - v.y * s, p.y + v.x * s + v.y * c);
  }
};
struct line {
  point a, b;
  line() {}
  line(point _a, point _b) {
    a = _a;
    b = _b;
  }
  bool operator==(line v) { return (a == v.a) && (b == v.b); }
  line(point p, double angle) {
    a = p;
    if (dblcmp(angle - pi / 2) == 0)
      b = a.add(point(0, 1));
    else
      b = a.add(point(1, tan(angle)));
  }
  line(double _a, double _b, double _c) {
    if (dblcmp(_a) == 0)
      a = point(0, -_c / _b), b = point(1, -_c / _b);
    else if (dblcmp(_b) == 0)
      a = point(-_c / _a, 0), b = point(-_c / _a, 1);
    else
      a = point(0, -_c / _b), b = point(1, (-_c - _a) / _b);
  }
  void input() {
    a.input();
    b.input();
  }
  void adjust() {
    if (b < a) swap(a, b);
  }
  double length() { return a.distance(b); }
  point crosspoint(line v) {
    double a1 = v.b.sub(v.a).det(a.sub(v.a));
    double a2 = v.b.sub(v.a).det(b.sub(v.a));
    return point((a.x * a2 - b.x * a1) / (a2 - a1),
                 (a.y * a2 - b.y * a1) / (a2 - a1));
  }
};
const int N = 110;
int n;
point pnt[N];
line ln[N];
int main() {
  scanf("%d", &n);
  if (n <= 4)
    return puts("No solution"), 0;
  else {
    double r = 250 / sin(pi / n);
    for (int i = 0; i < n; i++)
      pnt[i] = point(r * cos(2 * pi / n * i), r * sin(2 * pi / n * i));
    for (int i = 0; i < n; i++) {
      point u = pnt[i], v = pnt[(i + 1) % n];
      if (i % 2 == 1) {
        point dx = v.sub(u).rotleft().trunc(((i == 1) ? 2 * n : i) *
                                            cos(pi * (n - 4) / 2 / n));
        u = u.add(dx), v = v.add(dx);
      }
      ln[i] = line(u, v);
    }
    for (int i = 0; i < n; i++) ln[(i + n - 1) % n].crosspoint(ln[i]).output();
  }
}
