#include using namespace std; //------------------------------// // Utility //------------------------------// template inline bool chmax(S &a, T b) { return (a < b ? a = b, 1 : 0); } template inline bool chmin(S &a, T b) { return (a > b ? a = b, 1 : 0); } using pint = pair; using pll = pair; using tint = array; using tll = array; using fint = array; using fll = array; using qint = array; using qll = array; using vint = vector; using vll = vector; using ll = long long; using u32 = unsigned int; using u64 = unsigned long long; using i128 = __int128_t; using u128 = __uint128_t; template using min_priority_queue = priority_queue, greater>; #define REP(i, a) for (long long i = 0; i < (long long)(a); i++) #define REP2(i, a, b) for (long long i = a; i < (long long)(b); i++) #define RREP(i, a) for (long long i = (a)-1; i >= (long long)(0); --i) #define RREP2(i, a, b) for (long long i = (b)-1; i >= (long long)(a); --i) #define EB emplace_back #define PB push_back #define MP make_pair #define MT make_tuple #define FI first #define SE second #define ALL(x) x.begin(), x.end() #define COUT(x) cout << #x << " = " << (x) << " (L" << __LINE__ << ")" << endl // debug stream template ostream& operator << (ostream &s, pair P) { return s << '<' << P.first << ", " << P.second << '>'; } template ostream& operator << (ostream &s, array P) { return s << '<' << P[0] << ", " << P[1] << ", " << P[2] << '>'; } template ostream& operator << (ostream &s, array P) { return s << '<' << P[0] << ", " << P[1] << ", " << P[2] << ", " << P[3] << '>'; } template ostream& operator << (ostream &s, vector P) { for (int i = 0; i < P.size(); ++i) { if (i > 0) { s << " "; } s << P[i]; } return s; } template ostream& operator << (ostream &s, deque P) { for (int i = 0; i < P.size(); ++i) { if (i > 0) { s << " "; } s << P[i]; } return s; } template ostream& operator << (ostream &s, vector > P) { for (int i = 0; i < P.size(); ++i) { s << endl << P[i]; } return s << endl; } template ostream& operator << (ostream &s, set P) { for (auto it : P) { s << "<" << it << "> "; } return s; } template ostream& operator << (ostream &s, multiset P) { for (auto it : P) { s << "<" << it << "> "; } return s; } template ostream& operator << (ostream &s, unordered_set P) { for (auto it : P) { s << "<" << it << "> "; } return s; } template ostream& operator << (ostream &s, map P) { for (auto it : P) { s << "<" << it.first << "->" << it.second << "> "; } return s; } template ostream& operator << (ostream &s, unordered_map P) { for (auto it : P) { s << "<" << it.first << "->" << it.second << "> "; } return s; } // 4-neighbor const vector dx = {1, 0, -1, 0}; const vector dy = {0, 1, 0, -1}; // 8-neighbor const vector dx8 = {1, 0, -1, 0, 1, -1, 1, -1}; const vector dy8 = {0, 1, 0, -1, 1, 1, -1, -1}; // num of i such that (x & (1 << i)) != 0 int popcnt(int x) { return __builtin_popcount(x); } int popcnt(unsigned int x) { return __builtin_popcount(x); } int popcnt(long long x) { return __builtin_popcountll(x); } int popcnt(unsigned long long x) { return __builtin_popcountll(x); } // min non-negative i such that (x & (1 << i)) != 0 int bsf(int x) { return __builtin_ctz(x); } int bsf(unsigned int x) { return __builtin_ctz(x); } int bsf(long long x) { return __builtin_ctzll(x); } int bsf(unsigned long long x) { return __builtin_ctzll(x); } // floor, ceil template T floor(T a, T b) { if (a % b == 0 || a >= 0) return a / b; else return -((-a) / b) - 1; } template T ceil(T x, T y) { return floor(x + y - 1, y); } //------------------------------// // Solver //------------------------------// int main() { int N; cin >> N; if (N == 2) { cout << "No" << endl; } else if (N % 2 == 1) { cout << "Yes" << endl; REP(i, N) cout << i+1 << " "; cout << endl; } else { cout << "Yes" << endl; vector res{1}; for (int i = 2; i <= N; i += 2) res.EB(i); for (int i = N-1; i >= 3; i -= 2) res.EB(i); cout << res << endl; } }