#include <bits/stdc++.h>
using namespace std;
template <class T, class U>
inline T max(T &a, U &b) {
  return a > b ? a : b;
}
template <class T, class U>
inline T min(T &a, U &b) {
  return a < b ? a : b;
}
template <class T, class U>
inline T swap(T &a, U &b) {
  T tmp = a;
  a = b;
  b = tmp;
}
template <class T>
T gcd(T a, T b) {
  return (b != 0 ? gcd<T>(b, a % b) : a);
}
template <class T>
T lcm(T a, T b) {
  return (a / gcd<T>(a, b) * b);
}
int LB(vector<int> v, int val) {
  vector<int>::iterator low;
  low = lower_bound(v.begin(), v.end(), val);
  int ret = low - v.begin();
  return ret;
}
int UB(vector<int> v, int val) {
  vector<int>::iterator up;
  up = upper_bound(v.begin(), v.end(), val);
  int ret = up - v.begin();
  return ret;
}
class CLASS_NAME {
 public:
  int method_NAME() {}
};
int arr[100][100];
int main() {
  int n;
  while (cin >> n) {
    memset(arr, 0, sizeof(arr));
    int m = 0;
    for (int i = 1; i <= n; ++i) {
      for (int j = 1; j <= n; ++j) {
        if (i == 1 || j == 1) arr[i][j] = 1;
      }
    }
    for (int i = 1; i <= n; ++i) {
      for (int j = 1; j <= n; ++j) {
        if (i == 1 || j == 1)
          m = max(m, 1);
        else {
          arr[i][j] = arr[i - 1][j] + arr[i][j - 1];
          m = max(arr[i][j], m);
        }
      }
    }
    cout << m << endl;
  }
  return 0;
}
