#include <bits/stdc++.h>
using namespace std;
const long double eps = 1e-8;
const long double pi = acos(-1);
const int maxn = 105;
mt19937 rnd(2226701);
inline int sign(long double x) { return x < -eps ? -1 : (x > eps ? 1 : 0); }
inline int myRand() { return rnd() % (1000000 - 10000) + 10000; }
class Point {
 public:
  long double x, y;
  Point(long double x_ = 0, long double y_ = 0) : x(x_), y(y_) {}
  inline Point operator*(const long double &a) { return Point(a * x, a * y); }
  inline Point operator+(const Point &oth) const {
    return Point(x + oth.x, y + oth.y);
  }
  inline Point &operator+=(const Point &oth) {
    return (*this = Point(x + oth.x, y + oth.y));
  }
  inline Point operator-(const Point &oth) const {
    return Point(x - oth.x, y - oth.y);
  }
  inline long double operator*(const Point &oth) {
    return x * oth.y - y * oth.x;
  }
  inline long double abs() { return sqrt(x * x + y * y); }
} a[maxn];
class Line {
 public:
  Point P, d;
  Line(const Point P_ = Point(), const Point d_ = Point()) : P(P_), d(d_) {}
  inline bool include(const Point &oth) { return sign((oth - P) * d) == -1; }
} L;
inline long double tarea(Point A, Point B, Point C) {
  return (B - A) * (C - A) * 0.5;
}
inline Point cross(Line l_1, Line l_2) {
  l_1.d = l_1.d * 10000, l_2.d = l_2.d * 10000;
  long double S_1 = tarea(l_1.P, l_1.P + l_1.d, l_2.P);
  long double S_2 = -tarea(l_1.P, l_1.P + l_1.d, l_2.P + l_2.d);
  Point ret = (l_2.P * S_2 + (l_2.P + l_2.d) * S_1) * (1.0 / (S_1 + S_2));
  return ret;
}
int n;
long double theta;
inline bool check(Point P, int pos) {
  bool ret = true;
  ret &= (P.x >= 1 && P.x <= 1000000);
  ret &= (P.y >= 1 && P.y <= 1000000);
  ret &= !L.include(P);
  if (pos >= 2 && sign((a[0] - P) * (P - a[pos - 1])) == 1) ret = false;
  if (pos == n - 2) {
    long double alpha = theta * (n - 1);
    Point dir = Point(cos(alpha), sin(alpha));
    Point Q = cross(L, Line(P, dir));
    if (Q.x > 500) ret = false;
  }
  return ret;
}
int vis[1000005];
inline bool check() {
  vector<long double> all;
  for (int i = (int)(0); i < (int)(n); ++i)
    all.push_back((a[(i + 1) % n] - a[i]).abs());
  sort(all.begin(), all.end());
  for (int i = (int)(0); i < (int)(n); ++i)
    if (sign(all[i] - 1) <= 0) return false;
  for (int i = (int)(0); i < (int)(n - 1); ++i)
    if (all[i + 1] - all[i] < 0.001) return false;
  return true;
}
int main() {
  scanf("%d", &n);
  if (n <= 4) {
    puts("No solution");
    return 0;
  }
  theta = pi * 2 / n;
  L = Line(Point(500, 500), Point(-1, 0));
  for (bool found = false; !found;) {
    found = true;
    Point O(500, 500);
    a[0] = O;
    for (int i = (int)(1); i < (int)(n - 1); ++i) {
      int len;
      long double alpha = theta * i;
      Point dir = Point(cos(alpha), sin(alpha));
      int cnt = 0;
      for (len = myRand();
           cnt <= 100 && (vis[len] || !check(O + dir * (len / 10000.0), i) ||
                          sign((dir * len).abs() - 1) <= 0);
           len = myRand(), ++cnt)
        ;
      if (cnt > 100) {
        found = false;
        break;
      }
      O += dir * (len / 10000.0);
      a[i] = O;
      vis[len] = 1;
    }
    long double alpha = theta * (n - 1);
    Point dir = Point(cos(alpha), sin(alpha));
    O = cross(L, Line(O, dir));
    a[n - 1] = O;
    found &= check();
  }
  for (int i = (int)(0); i < (int)(n); ++i)
    printf("%.10lf %.10lf\n", (double)a[i].x, (double)a[i].y);
  return 0;
}
