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

#include <stdio.h>
#include <stdlib.h>

/****************************************\
| Thank you for viewing my code:)        |
| Written by RedSpica a.k.a. RanseMirage |
| Twitter:@asakaakasaka                  | 
\****************************************/

int main(void){
  int n;
  scanf("%d",&n);
  /*


  C=n*(n+1)/2とおく．

  n頂点からなる完全グラフを考えると，
  頂点iにおける隣接頂点の和は(C-i)である．
  ここで次の補題を考える．

  Lemma:頂点s,t(1<=s,t<=n,s!=t)をつなぐ辺を取り除いたとき，
  それぞれの隣接頂点の和は等しくなる．

  Proof:s,t,の隣接頂点の和はそれぞれ(C-s),(C-t)である．
  ここで，辺を取り除くとそれぞれの隣接頂点の和は(C-s-t),(C-t-s)となり等しい．

  まずnが偶数の時の考察をする．
  (s,t)=(1,n),(2,n-1),(3,n-2)...(n/2,n/2+1)というn/2個のペアを考える．
  このようにペアをとると，各ペアの隣接頂点の和は(C-(n+1))で等しくなる．
  よって，nが偶数の時は完全グラフからこれらの辺を除いたものを構成すればよい．

  次にnが奇数の時の考察をする．
  いま1~nがそれぞれ書かれたn頂点のグラフGを考えているが，これに頂点0を追加した
  (n+1)頂点からなるグラフG'を考える．するとグラフG'の各頂点における隣接頂点の和は
  変化しないことがわかる．そこで，先ほど同様(s,t)=(0,n),(1,n-1),...((n-1)/2,(n+1)/2)
  というペアを考えると，各ペアの隣接頂点の和は(C-n)で等しくなる．
  よってnが奇数の時は完全グラフG'からこれらの辺と頂点0から出る辺を除いたものを構成すればよい．

  最後に
  ・完全グラフの辺の本数=n*(n+1)/2
  ・取り除く本数はn/2の切り捨て
  ということがわかるので，構成するために必要な辺の本数は
  n*(n+1)/2-n/2であることがわかる．
  (下の実装では完全グラフの辺の数=(n角形の対角線の数)+(n角形の辺の数)という形で実装しています)


  実際の構成方法は以下のコードの通りで，計算量はO(n^2)で十分高速である．


  */
  int ans=(n-3)*n/2+n;
  ans-=n/2;
  printf("%d\n",ans);
  for(int i=1;i<=n;i++){
    for(int j=i+1;j<=n;j++){
      if(i+j==n+1 && n%2==0){
        continue;
      }
      if(i+j==n && n%2==1){
        continue;
      }

      printf("%d %d\n",i,j);
    }
  }
}