Problem:
Score : 700 points

Problem Statement

You are given an integer N.
Build an undirected graph with N vertices with indices 1 to N that satisfies the following two conditions:

The graph is simple and connected.

There exists an integer S such that, for every vertex, the sum of the indices of the vertices adjacent to that vertex is S.

It can be proved that at least one such graph exists under the constraints of this problem.

Constraints

All values in input are integers.

3 \leq N \leq 100

Input

Input is given from Standard Input in the following format:

N

Output

In the first line, print the number of edges, M, in the graph you made. In the i-th of the following M lines, print two integers a_i and b_i, representing the endpoints of the i-th edge.

The output will be judged correct if the graph satisfies the conditions.

Sample Input 1

3

Sample Output 1

2
1 3
2 3

For every vertex, the sum of the indices of the vertices adjacent to that vertex is 3.

Solution in Python (3.4.3) (judge verdict: Accepted)

def b_balanced_neighbors(N):
    """
    整数Nに対し、N頂点の無向グラフで、以下の条件を満たすものを1つ構成せよ。
    1. 単純かつ連結
    2. ∀S∈Z, ∀k, 頂点kに隣接する頂点の番号の値の和がS
    """

    # 非連結で、∀S∈Z, ∀k, 頂点kとそれに隣接する頂点の番号の値の和がS
    # を満たすグラフを考えると、この条件は補グラフが
    # 与えられた条件を満たすための十分条件となる。
    # この条件を考えると、{1, ..., N} を2つ以上のグループに分割する方法であって、
    # グループに含まれる辺の和がグループによらず一定となる方法を1つ見つければいい。
    # そのような方法が存在すれば、同じグループに属するような頂点間に辺を張った
    # グラフが上の条件を満たす。分割の方法例は以下のものがある。
    # Nが奇数: {1, N-1}, {2, N-2}, ..., {N} (和がN)
    # Nが偶数: {1, N}, {2, N-1}, ..., {N, 1} (和がN+1) (*)
    # 上の方法で構成されるグラフの補グラフはO(N**2)で構成可能である。
    pair_sum = N + 1 - (N % 2)
    ans_tmp = []
    for i in range(1, N + 1):
        for j in range(i + 1, N + 1):
            if i + j != pair_sum:
                # (*)で表された辺を除いたグラフを構成する
                ans_tmp.append((i, j))
    return '\n'.join([str(len(ans_tmp))] + [' '.join(map(str, a)) for a in ans_tmp])

N = int(input())
print(b_balanced_neighbors(N))