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

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h> // uint64_t

#define BUF_SIZE 10

int get_int(void) {
  int num;
#ifdef BUF_SIZE
  char line[BUF_SIZE];
  if(!fgets(line, BUF_SIZE, stdin)) return 0;
  sscanf(line, "%d", &num);
#else
#error
#endif
  return num;
}

// 446*447 < 100000*2 < 447*448=200256
#define N2_MAX 447
#define NUM_MAX 110000

int main(void) {
    static int map[NUM_MAX];
    int i, j;

    int num = get_int();
    // special case with n=1
    if(num == 1) {
        printf("Yes\n");
        printf("2\n"); // k=2
        printf("1 1\n");
        printf("1 1\n");
        return 0;
    }

    for(i = 2; i <= N2_MAX; i++) {
        map[i*(i+1)/2] = i;
    }
    int unit_num = map[num]; // i

    if(!unit_num) {
        printf("No\n"); return 0;
    } else {
        printf("Yes\n");
    }
    // all numbers use twice
    int k = (num*2)/unit_num; // i+1
    printf("%d\n", k);

    static int units[N2_MAX+1][N2_MAX+1];
    int idx = 1;
    for(i = 1; i <= k; i++) {
        for(j = 1; j <= (i-1); j++) {
            // fetch 1st one
            units[i][j] = units[j][i-1];
        }
        // get new one
        for(j = i; j <= unit_num; j++) {
            units[i][j] = idx++;
        }
    }

    for(i = 1; i <= k; i++) {
        printf("%d ", unit_num);
        for(j = 1; j <= unit_num; j++) {
            char n = (j == unit_num) ? '\n' : ' ';
            printf("%d%c", units[i][j], n);
        }
    }

    return 0;
}