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;
using Int = long long;
typedef pair<int,int> P; typedef map<int,int> MPi; typedef pair<Int,Int> Pl; typedef int8_t shor;
const int mod = 1000000007;
#define END {cout<<ans<<'\n'; return 0;}
#define ALL(v) v.begin(),v.end()
#define Pr(type) priority_queue<type>
#define gPr(type) priority_queue<type,vector<type>,greater<type>>
#define V(type) vector<type>
#define rep(i,n) for(int (i)=0; i<(n); i++)
#define PB push_back
template<class T> inline bool cmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool cmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }

int n;

int main(){
    cin.tie(nullptr); ios::sync_with_stdio(false);

    cin>>n; if(n%3){cout<<"No"<<'\n'; return 0;}
	V(int) a[4]={};
	a[0].push_back(1); a[0].push_back(2);
	a[1].push_back(1); a[1].push_back(3);
	a[2].push_back(2); a[2].push_back(3);
	if(n!=3){
	for (int i = 0; i < n/3-1; i++){
		a[0].PB(i*3+4);
		a[1].PB(i*3+5);
		a[2].PB(i*3+6);
	}
	}
	int h=(n==3?3:4);
	cout<<"Yes\n"<<h<<'\n';
	for (int i = 0; i < 3; i++){
		cout<<n/3+1<<' ';
		for (int j = 0; j < n/3+1; j++)cout<<a[i][j]<<(j==n/3?'\n':' ');
	}
	if(n!=3){
		for (int i = 0; i < n-3; i++)a[3].push_back(i+4);
		cout<<n-3<<' ';
		for (int i = 0; i < n-3; i++)cout<<a[3][i]<<(i==n-4?'\n':' ');
	}
}