Problem: Polycarpus loves convex polygons, especially if all their angles are the same and all their sides are different. Draw for him any such polygon with the given number of vertexes.

Input

The input contains a single integer n (3 ≤ n ≤ 100) — the number of the polygon vertexes.

Output

Print n lines, containing the coordinates of the vertexes of the n-gon "xi yi" in the counter clockwise order. The coordinates of the vertexes shouldn't exceed 106 in their absolute value. The side lengths should fit within limits [1, 1000] (not necessarily integer). Mutual comparing sides and angles of your polygon during the test will go with precision of 10 - 3.

If there is no solution, print "No solution" (without the quotes).

Examples

Input

8


Output

1.000 0.000
7.000 0.000
9.000 2.000
9.000 3.000
5.000 7.000
3.000 7.000
0.000 4.000
0.000 1.000

Solution (in CPP):

Solution:
#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;
}