#include <bits/stdc++.h>
using namespace std;
const int inf = ~0U >> 1;
const long long INF = ~0ULL >> 1;
const double pi = acos(-1.0);
template <class T>
inline void read(T &n) {
  char c;
  for (c = getchar(); !(c >= '0' && c <= '9'); c = getchar())
    ;
  n = c - '0';
  for (c = getchar(); c >= '0' && c <= '9'; c = getchar()) n = n * 10 + c - '0';
}
int Pow(int base, int n, int mo) {
  if (n == 0) return 1;
  if (n == 1) return base % mo;
  int tmp = Pow(base, n >> 1, mo);
  tmp = (long long)tmp * tmp % mo;
  if (n & 1) tmp = (long long)tmp * base % mo;
  return tmp;
}
struct point {
  double x, y;
  point() {}
  point(double _x, double _y) : x(_x), y(_y) {}
};
struct line {
  double k, b;
  int ver;
  line() {}
  line(double _k, double _b, int _ver = 0) : k(_k), b(_b), ver(_ver) {}
};
double R = 1000;
inline line gen_line(const point A, const point B) {
  if (fabs(A.x - B.x) < 1e-9) return line(0, A.x, 1);
  double k = (B.y - A.y) / (B.x - A.x);
  double b = A.y - A.x * k;
  return line(k, b);
}
inline point intersect(line A, line B) {
  if (B.ver) swap(A, B);
  if (A.ver) return point(A.b, B.k * A.b + B.b);
  double x = (B.b - A.b) / (A.k - B.k);
  double y = A.k * x + A.b;
  return point(x, y);
}
template <class T>
T sqr(const T &x) {
  return x * x;
}
inline double dis(const point &A, const point &B) {
  return sqrt(sqr(A.x - B.x) + sqr(A.y - B.y));
}
int n;
point p[200];
inline int pre(int x) { return (x == 1) ? n : (x - 1); }
inline int suc(int x) { return (x == n) ? 1 : (x + 1); }
vector<double> Len;
map<double, int> edge;
int timestamp = 0;
int check() {
  ++timestamp;
  edge.clear();
  Len.clear();
  double std_angle = -1;
  for (int i = (1); i <= (n); ++i) {
    double length = dis(p[i], p[i + 1]);
    int len = int(length * 100 + 0.5);
    if (edge[len] || edge[len - 1] || edge[len + 1]) return 0;
    edge[len] = 1;
    point A = p[suc(i)], B = p[pre(i)], C = p[i];
    double angle =
        acos(((A.x - C.x) * (B.x - C.x) + (A.y - C.y) * (B.y - C.y)) /
             (dis(A, C) * dis(B, C)));
    Len.push_back(length);
    if (std_angle < 1)
      std_angle = angle;
    else if (fabs(std_angle - angle) > 1e-3)
      return 0;
  }
  return 1;
}
int main() {
  scanf("%d", &n);
  R = n * 45;
  if (n <= 4) {
    puts("No solution");
    return 0;
  }
  for (int i = (1); i <= (n); ++i) {
    double angle = (double)(i - 1) / n * (2 * pi);
    p[i].x = R * cos(angle);
    p[i].y = R * sin(angle);
  }
  while (!check()) {
    for (int i = (1); i <= (n); ++i) {
      line A = gen_line(p[pre(i)], p[i]);
      line B = gen_line(p[suc(i)], p[suc(suc(i))]);
      line C = gen_line(p[i], p[suc(i)]);
      C.b += (rand() % 300) / 100.;
      p[i] = intersect(A, C);
      p[suc(i)] = intersect(B, C);
    }
  }
  for (int i = (1); i <= (n); ++i) printf("%.6lf %.6lf\n", p[i].x, p[i].y);
  return 0;
}
