#include <bits/stdc++.h>
using namespace std;
long long rdtsc() {
  long long tmp;
  asm("rdtsc" : "=A"(tmp));
  return tmp;
}
inline int myrand() { return abs((rand() << 15) ^ rand()); }
inline int rnd(int x) { return myrand() % x; }
struct Point {
  long double x, y;
  Point() {}
  Point(long double _x, long double _y) : x(_x), y(_y) {}
  inline Point operator-(const Point &p) const {
    return Point(x - p.x, y - p.y);
  }
  inline Point operator+(const Point &p) const {
    return Point(x + p.x, y + p.y);
  }
  inline Point operator*(long double k) const { return Point(x * k, y * k); }
  inline long double operator*(const Point &p) const {
    return x * p.x + y * p.y;
  }
  inline long double abs() const { return sqrt(x * x + y * y); }
};
struct Line {
  long double a, b, c;
  inline long double get(const Point &p) const { return a * p.x + b * p.y + c; }
  Line() {}
  Line(const Point &p1, const Point &p2) {
    a = p1.y - p2.y;
    b = p2.x - p1.x;
    {
      long double d = sqrt(a * a + b * b);
      a /= d, b /= d;
    }
    c = 0;
    c = -get(p1);
  }
};
bool intersect(const Line &l1, const Line &l2, Point &res) {
  long double D = l1.a * l2.b - l2.a * l1.b;
  if (fabs(D) < (1e-9)) return false;
  long double D1 = l1.b * l2.c - l1.c * l2.b;
  long double D2 = l1.c * l2.a - l1.a * l2.c;
  res = Point(D1 / D, D2 / D);
  return true;
}
Point myRotate(const Point &p, long double angle) {
  long double cosalf = cos(angle), sinalf = sin(angle);
  return Point(p.x * cosalf - p.y * sinalf, p.x * sinalf + p.y * cosalf);
}
const int maxn = (int)100 + 10;
Point ps[maxn];
long double ls[maxn];
long double perm[maxn];
bool solve() {
  int n;
  if (scanf("%d", &n) < 1) return 0;
  if (n <= 4) {
    printf("No solution\n");
    return 1;
  }
  long double angle = M_PI * 2 / n;
  Point v(2, 0);
  ps[0] = Point(0, 0);
  for (int i = 1; i < n; ++i) perm[i] = ((500 - i) / 500.0);
  for (int i = 1; i < n; ++i) {
    ps[i] = ps[i - 1] + (v * perm[i] * (i == n / 2 ? 150 : 1));
    v = myRotate(v, angle);
  }
  Line last(ps[n - 1], ps[n - 2]);
  Line first(ps[0], ps[0] + myRotate(Point(1, 0), -angle));
  if (!intersect(first, last, ps[n - 1])) {
    printf("No soulution\n");
    return 1;
  }
  for (int i = 0; i < n; ++i)
    printf("%.18lf %.18lf\n", (double)ps[i].x, (double)ps[i].y);
  ps[n] = ps[0], ps[n + 1] = ps[1];
  for (int i = 0; i < n; ++i) ls[i] = (ps[i] - ps[i + 1]).abs();
  assert(ls[0] >= 1 - (1e-9) && ls[n - 1] <= 1000 + (1e-9));
  sort(ls, ls + n);
  for (int i = 0; i < n - 1; ++i) {
    if (ls[i + 1] - ls[i] < 1e-3) {
      fprintf(stderr, "fail! n = %d\n", n);
      return 0;
    }
  }
  for (int i = 1; i <= n; ++i) {
    Point p1(ps[i] - ps[i - 1]), p2(ps[i] - ps[i + 1]);
    long double alf = (p1 * p2);
    alf /= p1.abs() * p2.abs();
    alf = acos(alf);
    if (abs(alf - angle) < 1e-3) {
      fprintf(stderr, "i = %d\n", i);
      fprintf(stderr, "fail! n = %d\n", n);
      return 0;
    }
  }
  return 1;
}
int main() {
  srand(23);
  while (1) {
    if (!solve()) break;
  }
  return 0;
}
