Problem:
Score : 500 points

Problem Statement

You are given an integer N. Determine if there exists a tuple of subsets of \{1,2,...N\}, (S_1,S_2,...,S_k), that satisfies the following conditions:

Each of the integers 1,2,...,N is contained in exactly two of the sets S_1,S_2,...,S_k.

Any two of the sets S_1,S_2,...,S_k have exactly one element in common.

If such a tuple exists, construct one such tuple.

Constraints

1 \leq N \leq 10^5

N is an integer.

Input

Input is given from Standard Input in the following format:

N

Output

If a tuple of subsets of \{1,2,...N\} that satisfies the conditions does not exist, print No.
If such a tuple exists, print Yes first, then print such subsets in the following format:

k
|S_1| S_{1,1} S_{1,2} ... S_{1,|S_1|}
:
|S_k| S_{k,1} S_{k,2} ... S_{k,|S_k|}

where S_i={S_{i,1},S_{i,2},...,S_{i,|S_i|}}.

If there are multiple such tuples, any of them will be accepted.

Sample Input 1

3

Sample Output 1

Yes
3
2 1 2
2 3 1
2 2 3

It can be seen that (S_1,S_2,S_3)=(\{1,2\},\{3,1\},\{2,3\}) satisfies the conditions.

Sample Input 2

4

Sample Output 2

No

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;

#define INF_LL (int64)1e18
#define INF (int32)1e9
#define REP(i, n) for(int64 i = 0;i < (n);i++)
#define FOR(i, a, b) for(int64 i = (a);i < (b);i++)
#define all(x) x.begin(),x.end()
#define fs first
#define sc second

using int32 = int_fast32_t;
using uint32 = uint_fast32_t;
using int64 = int_fast64_t;
using uint64 = uint_fast64_t;
using PII = pair<int32, int32>;
using PLL = pair<int64, int64>;

const double eps = 1e-10;

template<typename A, typename B>inline void chmin(A &a, B b){if(a > b) a = b;}
template<typename A, typename B>inline void chmax(A &a, B b){if(a < b) a = b;}

const int64 mod = 1e9+7;
int32 N;

int32 iton(int32 x){
	if(x > N){
		return x-N+1;
	}
	return x;
}

int main(void){
	cin >> N;
	if(N > 1 && N%2 == 1){
		cout << "Yes" << endl;
		cout << N << endl;
		REP(i, N){
			cout << 2 << " " << (i+1) << " " << iton(i+2) << endl;
		}
	}else if(N % 2 == 0 && N > 4){
		cout << "Yes" << endl;
		cout << N/2+1 << endl;
		for(int32 i = 0;i < N;i += 2){
			cout << 3 << " " << (i+1) << " " << iton(i+2) << " " << iton(i+3) << endl;
		}
		cout << N/2 << " ";
		for(int32 i = 2;i <= N;i += 2){
			cout << i << " ";
		}
		cout << endl;
	}else if(N == 1){
		cout << "Yes" << endl;
		cout << 2 << endl;
		cout << 1 << 1 << endl;
		cout << 1 << 1 << endl;
	}else{
		cout << "No" << endl;
	}
}