#include <bits/stdc++.h>
using namespace std;
enum STATE { IN, OUT, BOUNDRY };
const long long MOD = 1000000007;
const int INF = 2000 * 1000 * 1000 + 5;
const int MAX = 1005;
int popcount(int n) {
  bitset<32> b(n);
  return b.count();
}
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
long long lcm(long long a, long long b) {
  long long temp = gcd(a, b);
  return temp ? (a / temp * b) : 0;
}
template <typename T>
T modpow(T base, T exp, T modulus) {
  base %= modulus;
  T result = 1;
  while (exp > 0) {
    if (exp & 1) result = (result * base) % modulus;
    base = (base * base) % modulus;
    exp >>= 1;
  }
  return result;
}
inline bool isInteger(const std::string& s) {
  if (s.empty() || ((!isdigit(s[0])) && (s[0] != '-') && (s[0] != '+')))
    return false;
  char* p;
  strtol(s.c_str(), &p, 10);
  return (*p == 0);
}
bool intersect(const complex<long double>& a, const complex<long double>& b,
               const complex<long double>& p, const complex<long double>& q,
               complex<long double>& ret) {
  double d1 = ((conj(p - a) * (b - a)).imag());
  double d2 = ((conj(q - a) * (b - a)).imag());
  ret = (complex<long double>((d1 * q.real()) / (d1 - d2),
                              (d1 * q.imag()) / (d1 - d2)) -
         complex<long double>((d2 * p.real()) / (d1 - d2),
                              (d2 * p.imag()) / (d1 - d2)));
  if (fabs(d1 - d2) > 1e-9) return 1;
  return 0;
}
long double polygonArea(const vector<complex<long double> >& p) {
  long double res = 0;
  for (int i = 0; i < ((int)(p).size()); i++) {
    int j = (i + 1) % ((int)(p).size());
    res += ((conj(p[i]) * (p[j])).imag());
  }
  return fabs(res) / 2;
}
void polygonCut(const vector<complex<long double> >& p,
                const complex<long double>& a, const complex<long double>& b,
                vector<complex<long double> >& res) {
  res.clear();
  for (int i = 0; i < ((int)(p).size()); i++) {
    int j = (i + 1) % ((int)(p).size());
    bool in1 = ((conj(((b) - (a))) * (((p[i]) - (a)))).imag()) > 1e-9;
    bool in2 = ((conj(((b) - (a))) * (((p[j]) - (a)))).imag()) > 1e-9;
    if (in1) res.push_back(p[i]);
    if (in1 ^ in2) {
      complex<long double> r;
      intersect(a, b, p[i], p[j], r);
      res.push_back(r);
    }
  }
}
void convexPolygonIntersect(const vector<complex<long double> >& p,
                            const vector<complex<long double> >& q,
                            vector<complex<long double> >& res) {
  res = q;
  for (int i = 0; i < ((int)(p).size()); i++) {
    int j = (i + 1) % ((int)(p).size());
    vector<complex<long double> > temp;
    polygonCut(res, p[i], p[j], temp);
    res = temp;
    if (res.empty()) return;
  }
}
int main() {
  int n;
  cin >> n;
  for (int i = 0; i < n - 1; i++) printf("%d ", i + 2);
  cout << 1 << endl;
  return 0;
}

### Prompt

In cpp, your task is to solve the following problem:

Vasya bought the collected works of a well-known Berland poet Petya in n volumes. The volumes are numbered from 1 to n. He thinks that it does not do to arrange the book simply according to their order. Vasya wants to minimize the number of the disposition’s divisors — the positive integers i such that for at least one j (1 ≤ j ≤ n) is true both: j mod i = 0 and at the same time p(j) mod i = 0, where p(j) is the number of the tome that stands on the j-th place and mod is the operation of taking the division remainder. Naturally, one volume can occupy exactly one place and in one place can stand exactly one volume.

Help Vasya — find the volume disposition with the minimum number of divisors.

Input

The first line contains number n (1 ≤ n ≤ 100000) which represents the number of volumes and free places.

Output

Print n numbers — the sought disposition with the minimum divisor number. The j-th number (1 ≤ j ≤ n) should be equal to p(j) — the number of tome that stands on the j-th place. If there are several solutions, print any of them.

Examples

Input

2


Output

2 1 


Input

3


Output

1 3 2 

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
enum STATE { IN, OUT, BOUNDRY };
const long long MOD = 1000000007;
const int INF = 2000 * 1000 * 1000 + 5;
const int MAX = 1005;
int popcount(int n) {
  bitset<32> b(n);
  return b.count();
}
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
long long lcm(long long a, long long b) {
  long long temp = gcd(a, b);
  return temp ? (a / temp * b) : 0;
}
template <typename T>
T modpow(T base, T exp, T modulus) {
  base %= modulus;
  T result = 1;
  while (exp > 0) {
    if (exp & 1) result = (result * base) % modulus;
    base = (base * base) % modulus;
    exp >>= 1;
  }
  return result;
}
inline bool isInteger(const std::string& s) {
  if (s.empty() || ((!isdigit(s[0])) && (s[0] != '-') && (s[0] != '+')))
    return false;
  char* p;
  strtol(s.c_str(), &p, 10);
  return (*p == 0);
}
bool intersect(const complex<long double>& a, const complex<long double>& b,
               const complex<long double>& p, const complex<long double>& q,
               complex<long double>& ret) {
  double d1 = ((conj(p - a) * (b - a)).imag());
  double d2 = ((conj(q - a) * (b - a)).imag());
  ret = (complex<long double>((d1 * q.real()) / (d1 - d2),
                              (d1 * q.imag()) / (d1 - d2)) -
         complex<long double>((d2 * p.real()) / (d1 - d2),
                              (d2 * p.imag()) / (d1 - d2)));
  if (fabs(d1 - d2) > 1e-9) return 1;
  return 0;
}
long double polygonArea(const vector<complex<long double> >& p) {
  long double res = 0;
  for (int i = 0; i < ((int)(p).size()); i++) {
    int j = (i + 1) % ((int)(p).size());
    res += ((conj(p[i]) * (p[j])).imag());
  }
  return fabs(res) / 2;
}
void polygonCut(const vector<complex<long double> >& p,
                const complex<long double>& a, const complex<long double>& b,
                vector<complex<long double> >& res) {
  res.clear();
  for (int i = 0; i < ((int)(p).size()); i++) {
    int j = (i + 1) % ((int)(p).size());
    bool in1 = ((conj(((b) - (a))) * (((p[i]) - (a)))).imag()) > 1e-9;
    bool in2 = ((conj(((b) - (a))) * (((p[j]) - (a)))).imag()) > 1e-9;
    if (in1) res.push_back(p[i]);
    if (in1 ^ in2) {
      complex<long double> r;
      intersect(a, b, p[i], p[j], r);
      res.push_back(r);
    }
  }
}
void convexPolygonIntersect(const vector<complex<long double> >& p,
                            const vector<complex<long double> >& q,
                            vector<complex<long double> >& res) {
  res = q;
  for (int i = 0; i < ((int)(p).size()); i++) {
    int j = (i + 1) % ((int)(p).size());
    vector<complex<long double> > temp;
    polygonCut(res, p[i], p[j], temp);
    res = temp;
    if (res.empty()) return;
  }
}
int main() {
  int n;
  cin >> n;
  for (int i = 0; i < n - 1; i++) printf("%d ", i + 2);
  cout << 1 << endl;
  return 0;
}

```