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 Java8 (OpenJDK 1.8.0) (judge verdict: Accepted)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main
{

  public static void main(String[] args) throws IOException
  {

    BufferedReader r = new BufferedReader(new InputStreamReader(System.in), 1);
    String s;
    String[] sl;

    s = r.readLine();
    long n = Long.parseLong(s);

    int k = 0;
    for(k = 0; k * (k - 1) / 2 < n; k++);
    
    if(k * (k - 1) / 2 > n)
    {
      System.out.println("No");
      System.exit(0);
    }
    System.out.println("Yes");
    System.out.println(k);
    
    int a[][] = new int[500][500];
    
    int z[] = new int[500];
    int w[] = new int[500];
    
    int v = 1;
    
    StringBuilder sb = new StringBuilder();
    
    for(int i = 0; i < k; i++)
    {
      for(int j = 0; j < i; j++)
      {
        a[i][z[i]] = a[j][w[j]];
        z[i]++;
        w[i]++;
        w[j]++;
      }
      while(z[i] < k - 1)
      {
        a[i][z[i]] = v;
        z[i]++;
        v++;
      }
    }
    
    for(int i = 0; i < k; i++)
    {
      sb.append(z[i]);
      for(int j = 0; j < z[i]; j++)
      {
        sb.append(" ");
        sb.append(a[i][j]);
      }
      sb.append("\n");
    }
    
    System.out.println(sb);
  }

}