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 int MAX = 3e5 + 10;
const long long MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const long long LLINF = 0x3f3f3f3f3f3f3f3f;
const long double EPS = 1e-8;
const long double PI = acos(-1);
bool eq(long double a, long double b) { return fabsl(a - b) <= EPS; }
struct point {
  long double x, y;
  int id;
  point(long double x = 0, long double y = 0) : x(x), y(y) {}
  point operator+(const point &o) const { return {x + o.x, y + o.y}; }
  point operator-(const point &o) const { return {x - o.x, y - o.y}; }
  point operator*(long double t) const { return {x * t, y * t}; }
  point operator/(long double t) const { return {x / t, y / t}; }
  long double operator*(const point &o) const { return x * o.x + y * o.y; }
  long double operator^(const point &o) const { return x * o.y - y * o.x; }
  bool operator<(const point &o) const {
    if (!eq(x, o.x)) return x < o.x;
    return y < o.y;
  }
  bool operator==(const point &o) const { return eq(x, o.x) and eq(y, o.y); }
};
long double norm(point a) { return sqrt(a * a); }
point rotccw(point p, long double a) {
  a = acos(-1) * a / 180;
  return point((p.x * cos(a) - p.y * sin(a)), (p.y * cos(a) + p.x * sin(a)));
}
int ccw(point a, point b, point e) {
  long double tmp = (b - a) ^ (e - a);
  return (tmp > EPS) - (tmp < -EPS);
}
struct line {
  point p1, p2;
  long double a, b, c;
  line(point p1 = 0, point p2 = 0) : p1(p1), p2(p2) {
    a = p1.y - p2.y;
    b = p2.x - p1.x;
    c = -(a * p1.x + b * p1.y);
  }
  line(long double a = 0, long double b = 0, long double c = 0)
      : a(a), b(b), c(c) {}
  long double eval(point p) { return a * p.x + b * p.y + c; }
  bool inside(point p) { return eq(eval(p), 0); }
  point normal() { return point(a, b); }
  bool inside_seg(point p) {
    return (inside(p) and min(p1.x, p2.x) <= p.x and p.x <= max(p1.x, p2.x) and
            min(p1.y, p2.y) <= p.y and p.y <= max(p1.y, p2.y));
  }
};
point inter(line &l1, line &l2) {
  long double det = l1.a * l2.b - l1.b * l2.a;
  if (det == 0) return point(INF, INF);
  long double x = (l1.b * l2.c - l1.c * l2.b) / det;
  long double y = (l1.c * l2.a - l1.a * l2.c) / det;
  return point(x, y);
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  ;
  int n;
  cin >> n;
  if (n <= 4) {
    cout << "No solution\n";
    return 0;
  }
  point p = point(500, 500);
  vector<point> poly;
  for (int i = 0; i < n; i++)
    poly.push_back(p + rotccw(point(0, 490), i * 360 / (long double)n));
  vector<line> lines;
  for (int i = 0; i < n; i++) lines.push_back(line(poly[i], poly[(i + 1) % n]));
  long double delta = (n < 50 ? 1 : 0.5);
  long double k = 1;
  for (int i = 0; i < n; i++) {
    if (ccw(lines[i].p1, lines[i].p2, poly[(i + 2) % n]) == 1)
      lines[i].c += k;
    else
      lines[i].c -= k;
    k += delta;
  }
  cout << fixed << setprecision(12);
  for (int i = 0; i < n; i++) {
    point p = inter(lines[i], lines[(i + 1) % n]);
    cout << p.x << " " << p.y << '\n';
  }
  return 0;
}