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: Wrong Answer)

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

public static class combi
{
    public static IEnumerable<IEnumerable<T>> Comb<T>(this IEnumerable<T> items, int r)
    {
        if (r == 0)
        {
            yield return Enumerable.Empty<T>();
        }
        else
        {
            var i = 1;
            foreach (var x in items)
            {
                var xs = items.Skip(i);
                foreach (var c in Comb(xs, r - 1))
                    yield return c.Before(x);
                i++;
            }
        }
    }
    public static IEnumerable<T> Before<T>(this IEnumerable<T> items, T first)
    {
        yield return first;
        foreach (var i in items)
            yield return i;
    }
}

public class Hello
{
    public static void Main()
    {
        var n = int.Parse(Console.ReadLine().Trim());
        if (n == 1)
        {
            Console.WriteLine("Yes");
            Console.WriteLine("1 1");
            goto exit;
        }
        if (getX(n) == -1) { Console.WriteLine("No"); goto exit; }
        var d = new Dictionary<int, List<int>>();
        var a = Enumerable.Range(1, n).Comb(2);
        var nx = getX(n);
        for (int i = 1; i <= nx; i++) d[i] = new List<int>();
        Console.WriteLine("Yes");
        Console.WriteLine(nx);
        var p = 1;
        foreach (var x in Enumerable.Range(1, nx).Comb(2))
        {
            foreach (var y in x)
                d[y].Add(p);
            p++;
        }
        getAns(d);
        exit:;
    }
    public static void getAns(Dictionary<int, List<int>> d)
    {
        var dc = d[1].Count();
        foreach (var x in d)
        {
            Console.Write("{0} ", dc);
            Console.WriteLine(string.Join(" ", x.Value));
        }
    }
    static int getX(int n)
    {
        var n2 = n * 2;
        for (int i = 1; i <= n; i++)
            if (i * (i - 1) == n2) return i;
        return -1;
    }
}