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

def 解():
    iN = int(input())

    #これも解法を見て作った

    iK = int((2 * iN) ** 0.5)
    if 2 * iN != iK * (iK +1 ) :
        print("No")
    else:
        print("Yes")
        print(iK+1)
        aD = [ [0] * iK for _ in range(iK)]
        iMaxCol = 0
        iRow = 0
        iCol = 0
        for i in range(1,iN+1):
            aD[iRow][iCol] = i
            if iCol == iMaxCol:
                iMaxCol += 1
                iRow += 1
                iCol = 0
            else:
                iCol += 1

        oAns = []
        iRC = 0
        iStartCol = 0
        iStartRow = 0
        for i in range(iK):
            aTmp = []
            aTmp.append(iK)
            for j in range(iK):
                if iRC == 0:
                    aTmp.append(aD[iStartRow][j])
                else:
                    aTmp.append(aD[j][iStartCol])
                if j == iStartCol:
                    iRC = 1
            oAns.append(" ".join([str(_) for _ in aTmp]))
            iStartCol += 1
            iStartRow += 1
            iRC = 0
        aTmp = []
        aTmp.append(iK)
        for i in range(iK):
            aTmp.append(aD[i][i])

        oAns.append(" ".join([str(_) for _ in aTmp]))
        print("\n".join(oAns))
解()