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 Python (2.7.6) (judge verdict: Accepted)

import sys
from collections import deque
import copy

def get_read_func(fileobject):
    if fileobject == None :
        return raw_input
    else:
        return fileobject.readline


def main():
    if len(sys.argv) > 1:
        f = open(sys.argv[1])
    else:
        f = None
    read_func = get_read_func(f);
    input_raw = read_func().strip().split()
    [N] = [long(input_raw[0])]

    if N==1:
        print "Yes"
        print 2
        print 1, 1
        print 1, 1
        exit()
    x = 3
    idx = 1
    accept_set = set([x])
    is_accept = False
    while x <= N:
        if N == x:
            is_accept = True
            break
        x += (idx + 2)
        accept_set.add(x)
        idx += 1

    
    if is_accept == False:
        print "No"
        exit()


    base = idx + 1
    row_num = base + 1
    col_num = base

    res = [[0 for i in range(col_num)] for j in range(row_num)]
    count = 1
    for i in range(row_num):
        for j in range(i, col_num):
            res[i][j] = count
            count += 1
        for k in range(col_num - i):
            res[i + k + 1][i] = res[i][k + i]

    print "Yes"
    print base + 1
    for i in range(row_num):
        print base,
        for j in range(col_num):
            print res[i][j],
        print
        




if __name__ == '__main__':
    main()