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