Problem:
Score : 700 points

Problem Statement

You are given an integer N. Determine if there exists a tree with 2N vertices numbered 1 to 2N satisfying the following condition, and show one such tree if the answer is yes.

Assume that, for each integer i between 1 and N (inclusive), Vertex i and N+i have the weight i. Then, for each integer i between 1 and N, the bitwise XOR of the weights of the vertices on the path between Vertex i and N+i (including themselves) is i.

Constraints

N is an integer.

1 \leq N \leq 10^{5}

Input

Input is given from Standard Input in the following format:

N

Output

If there exists a tree satisfying the condition in the statement, print Yes; otherwise, print No.
Then, if such a tree exists, print the 2N-1 edges of such a tree in the subsequent 2N-1 lines, in the following format:

a_{1} b_{1}
\vdots
a_{2N-1} b_{2N-1}

Here each pair (a_i, b_i) means that there is an edge connecting Vertex a_i and b_i. The edges may be printed in any order.

Sample Input 1

3

Sample Output 1

Yes
1 2
2 3
3 4
4 5
5 6

The sample output represents the following graph:

Sample Input 2

1

Sample Output 2

No

There is no tree satisfying the condition.

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Accepted)

import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		int tmp = num;
		while(tmp % 2 == 0) {
			tmp /= 2;
		}
		if(tmp == 1) { System.out.println("No"); return; }
		System.out.println("Yes");
		int line = (int)(Math.floor((num + 1) / 4.0) * 4) - 1;
		StringBuilder ans = new StringBuilder();
		for(int i = 1; i < line; i ++) {
			ans.append(i+" "+(i + 1)+"\n");
			ans.append((num + i)+" "+(num + i + 1)+"\n");
		}
		ans.append(line+" "+(num + 1)+"\n");
		int rest = num - line;
		switch(rest) {
		case 0: break;
		case 1:
			ans.append((num / tmp + 1)+" "+(line + 1)+"\n");
			ans.append((num - num / tmp)+" "+(num + line + 1)+"\n");
			break;
		case 2: case 3:
			ans.append((1)+" "+(line + 1)+"\n");
			ans.append((line + 1)+" "+(line + 2)+"\n");
			ans.append((num + 1)+" "+(num + line + 2)+"\n");
			ans.append((num + line + 2)+" "+(num + line + 1)+"\n");
			if(rest == 3) {
				ans.append((num + line + 2)+" "+(line + 3)+"\n");
				ans.append((num + 2)+" "+(num + line + 3)+"\n");
			}
			break;
		}
		System.out.println(ans);
	}
}