#include <bits/stdc++.h>
using namespace std;
inline int Get() {
  int res = 0, q = 1;
  char ch = getchar();
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') q = -1, ch = getchar();
  while (ch >= '0' && ch <= '9') res = res * 10 + ch - '0', ch = getchar();
  return res * q;
}
const double eps = 1e-3, pi = M_PI;
const int oo = (int)2e9, mod = (int)1e9 + 7;
const long long INF = (long long)1e17;
struct vec {
  double x, y;
};
struct line {
  vec p, t;
};
vec operator+(const vec &a, const vec &b) {
  return (vec){a.x + b.x, a.y + b.y};
}
vec operator-(const vec &a, const vec &b) {
  return (vec){a.x - b.x, a.y - b.y};
}
vec operator*(const double &a, const vec &b) { return (vec){a * b.x, a * b.y}; }
double operator/(const vec &a, const vec &b) {
  return fabs(b.x) > 0 ? a.x / b.x : a.y / b.y;
}
double operator*(const vec &a, const vec &b) { return a.x * b.y - a.y * b.x; }
double operator^(const vec &a, const vec &b) { return a.x * b.x + a.y * b.y; }
bool operator==(const vec &a, const vec &b) { return a.x == b.x && a.y == b.y; }
inline bool Equal(double a, double b) { return fabs(a - b) < eps; }
inline double Dist(vec a) { return sqrt(((a.x) * (a.x)) + ((a.y) * (a.y))); }
inline vec Line_Cross(line a, line b) {
  vec P = b.p - a.p;
  double t = (P * b.t) / (a.t * b.t);
  return a.p + t * a.t;
}
vec Rot(vec x, double y) {
  vec d;
  d.x = x.x * cos(y) - x.y * sin(y);
  d.y = x.y * cos(y) + x.x * sin(y);
  return d;
}
double Random() { return 0.95 + (double)(rand() / 5 * 2) / (double)RAND_MAX; }
const int N = 100;
line a[N + 10];
int n;
double ang, l[N + 10];
int main() {
  srand(time(NULL));
  scanf(
      "%d"
      "\n",
      &n);
  if (n <= 4) return printf("No solution\n"), 0;
  ang = 2 * pi / n;
  a[1].t = (vec){400, 0}, a[1].p = (vec){0, 0};
  for (int i = (2), end = (n); i <= end; ++i) {
    a[i].p = a[i - 1].p + a[i - 1].t;
    a[i].t = Rot(a[i - 1].t, ang);
  }
  for (;;) {
    bool ext = 1;
    for (int i = (1), end = (n); i <= end; ++i) {
      l[i] = Dist(a[i].t);
      bool flag = 0;
      for (int j = (1), end = (i - 1); j <= end; ++j)
        if (Equal(l[i], l[j])) {
          flag = 1;
          break;
        }
      if (!flag) continue;
      ext = 0;
      int nx = i % n + 1, nt = nx % n + 1;
      double p = Random();
      vec cr;
      for (;; p = Random()) {
        if (fabs(p - 1) < eps) continue;
        vec np = a[i].p + p * a[i].t;
        line next = (line){np, a[nx].t};
        cr = Line_Cross(next, a[nt]);
        vec dt = cr - np;
        if ((dt / a[nx].t) < eps) continue;
        a[i].t = p * a[i].t, a[nx].p = a[i].p + a[i].t, a[nt].p = cr;
        a[nx].t = a[nt].p - a[nx].p;
        l[i] = Dist(a[i].t), l[nx] = Dist(a[nx].t), l[nt] = Dist(a[nt].t);
        if (l[i] - 1 < eps || 1000 - l[i] < eps) continue;
        if (l[nx] - 1 < eps || 1000 - l[nx] < eps) continue;
        if (l[nt] - 1 < eps || 1000 - l[nt] < eps) continue;
        bool ck = 1;
        for (int j = (1), end = (n); j <= end; ++j)
          if (j != i)
            if (Equal(l[i], l[j])) {
              ck = 0;
              break;
            }
        if (ck) break;
      }
    }
    if (ext) break;
  }
  for (int i = (1), end = (n); i <= end; ++i)
    printf(
        "%.10lf"
        " "
        "%.10lf"
        "\n",
        a[i].p.x, a[i].p.y);
  return 0;
}
