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 OCaml (4.10.0) (judge verdict: Accepted)

Scanf.scanf "%d" (fun n ->
    let dump k =
        let a = Array.make k [] in
        let rec loop_i i cur =
            let rec loop_j j cur =
                if j >= k then cur else (
                    a.(i) <- cur :: a.(i);
                    a.(j) <- cur :: a.(j);
                    loop_j (j + 1) (cur + 1)
                )
            in
            if i = k then () else
                loop_i (i + 1) (loop_j (i + 1) cur)
        in
        loop_i 0 1;
        Array.iter (fun l ->
            let b = Array.of_list l in
            Printf.printf "%d" (Array.length b);
            Array.iter (Printf.printf " %d") b;
            print_newline ()) a
    in

    let rec loop k =
        let k2 = k * (k - 1) / 2 in
        if k2 = n then k else
            if k2 < n then loop (k + 1) else (-1)
    in
    let k = loop 2 in
    if k < 0 then print_endline "No" else (
        Printf.printf "Yes\n%d\n" k;
        dump k
    )
)