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.Linq;
using System.Collections.Generic;
using static System.Console;
using static System.Math;
 
public class Hello{
    public static void Main(){
/*        string[] input = ReadLine().Split(' ');
        long a = long.Parse(input[0]);
        long b = long.Parse(input[1]);
        long c = long.Parse(input[2]);
//        long d = long.Parse(input[3]);*/
//        string temp = ReadLine();
        int a = int.Parse(ReadLine());
//        int b = int.Parse(ReadLine());
//        int c = int.Parse(ReadLine());
//        int d = int.Parse(ReadLine());
//        string a = ReadLine();
//        string b = ReadLine();
//        string c = ReadLine();
//        string[] input = ReadLine().Split(' ');
//        string ko = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        int b = 0;
        for(int i=0;i<a;i++){
            int temp = (i*(i+1))/2;
            if(temp == a){
                b = i;
            }
        }
        if(a==1){
            WriteLine("Yes");
            WriteLine("2");
            WriteLine("1 1");
            WriteLine("1 1");
        }else if(b==0){
            WriteLine("No");
        }else{
            WriteLine("Yes");
            WriteLine(b+1);
            int[,] map = new int[b+1,b];
/*            for(int i=0;i<b+1;i++){
                for(int j=0;j<b;j++){
                    map[i,j] = 1;
                }
            }*/
            int kazu = 1;
            for(int i=0;i<b;i++){
                for(int j=i;j<b;j++){
                        map[i,j] = kazu;
                        map[j+1,i] = kazu;
                        kazu++;
//                        WriteLine("{0} {1} {2}",i,j,map[i,j]);
//                        WriteLine("{0} {1} {2}",j+1,i,map[j+1,i]);
                }
            }
            for(int i=0;i<b+1;i++){
                Write(b+" ");
                for(int j=0;j<b;j++){
                    if(j == b-1){
                        Write(map[i,j]);
                    }else{
                        Write(map[i,j]+" ");
                    }
                }
                WriteLine();
            }
        }
    }
}