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 Scala (2.11.7) (judge verdict: Accepted)

import java.io._
import java.util.StringTokenizer
import scala.util.control.Breaks.{breakable,break}

object Main extends App {
  val in = new InputReader(System.in)
  val pw = new PrintWriter(System.out)

  // val a = new Array[Int](N)


  val N = in.next().toInt

  if(N == 1) {
    println("Yes")
    println(2)
    println("1 1")
    println("1 1")
  }
  else{
    var flag = false
    var s = -1
    breakable {
      for(i <- 2 to 1000) {
        if (N * 2 == i * (i+1)) {
          flag = true
          s = i
          break
        }
      }
    }

    if(flag) {
      val ans = Array.ofDim[Int](s+1, s)
      for(i <- 1 to s) {
        ans(0)(i-1) = i
      }

      var cnt = s + 1
      for(i <- 1 until s+1) {
        for (k <- 1 to i) {
          ans(i)(k-1) = ans(k-1)(i-1)
        }
        for (k <- i+1 to s) {
          ans(i)(k-1) = cnt
          cnt += 1
        }
      }


      pw.println("Yes")
      pw.println(s+1)
      for(i <- 0 until s+1) {
        pw.print(s)
        pw.print(" ")
        pw.println(ans(i).mkString(" "))
      }
      pw.flush()
    }
    else {
      println("No")
    }
  }
}


class InputReader(stream: InputStream) {
  private val reader = new BufferedReader(new InputStreamReader(stream))
  private var tokenizer: StringTokenizer = new StringTokenizer(reader.readLine())
  def next(): String = {
    while (!tokenizer.hasMoreTokens()) {
      tokenizer = new StringTokenizer(reader.readLine())
    }
    tokenizer.nextToken()
  }
}