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# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class TEST{
	static void Main(){
		Sol mySol =new Sol();
		mySol.Solve();
	}
}

class Sol{
	public void Solve(){
		if(N == 1){
			Console.WriteLine("Yes");
			Console.WriteLine(2);
			Console.WriteLine("1 1");
			Console.WriteLine("1 1");
			return;
		}
		if(N == 3){
			Console.WriteLine("Yes");
			Console.WriteLine(3);
			Console.WriteLine("2 1 2");
			Console.WriteLine("2 1 3");
			Console.WriteLine("2 2 3");
			return;
		}
		
		if( N == 6){
			List<int>[] L = new List<int>[3];
			for(int i=0;i<3;i++){
				L[i] = new List<int>();
			}
			for(int i=3;i<N;i++){
				L[i % 3].Add(i + 1);
			}
			Console.WriteLine("Yes");
			Console.WriteLine(4);
			Console.WriteLine("{0} 1 2 {1}",N / 3 + 1,String.Join(" ",L[0]));
			Console.WriteLine("{0} 2 3 {1}",N / 3 + 1,String.Join(" ",L[1]));
			Console.WriteLine("{0} 1 3 {1}",N / 3 + 1,String.Join(" ",L[2]));
			Console.WriteLine("{0} {1}",N - 3, String.Join(" ",L[0]) + " " + String.Join(" ",L[1]) + " " + String.Join(" ",L[2]));
			return;
		}
		
		for(int i=3;i*i<=4 * N;i++){
			int tot = (i * i - i) / 2 + i;
			if(tot == N){
				List<int>[] ans = new List<int>[i];
				for(int j=0;j<i;j++) ans[j] = new List<int>();
				
				for(int j=0;j<i;j++) ans[j].Add(j + 1);
				int l = 0;
				int r = 1;
				int num = i + 1;
				while(l < i){
					r = l + 1;
					while(ans[l].Count < i){
						ans[l].Add(num);
						ans[r].Add(num);
						r++;
						num++;
					}
					l++;
				}
				Console.WriteLine("Yes");
				Console.WriteLine(i + 1);
				List<int> a = new List<int>();
				for(int j=0;j<i;j++) a.Add(j + 1);
				Console.WriteLine("{0} {1}",a.Count,String.Join(" ",a));
				for(int j=0;j<i;j++){
					Console.WriteLine("{0} {1}",ans[j].Count, String.Join(" ",ans[j]));
				}
				return;
			}
		}
		
		
		
		
		Console.WriteLine("No");
	}
	int N;
	public Sol(){
		N = ri();
	}

	static String rs(){return Console.ReadLine();}
	static int ri(){return int.Parse(Console.ReadLine());}
	static long rl(){return long.Parse(Console.ReadLine());}
	static double rd(){return double.Parse(Console.ReadLine());}
	static String[] rsa(char sep=' '){return Console.ReadLine().Split(sep);}
	static int[] ria(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>int.Parse(e));}
	static long[] rla(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>long.Parse(e));}
	static double[] rda(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>double.Parse(e));}
}