import java.math.BigInteger;
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
BigInteger ans = BigInteger.TWO.pow(N).subtract(BigInteger.ONE);
System.out.println(ans);
if(N<=20) Hanoi_Top(N,1,2,3);
}
static void Hanoi_Top(int N, int from, int temp, int to){
if(N==1){
System.out.println(from +" "+to);
return;
}
Hanoi_Top(N-1,from,to,temp); // 자기 자신보다 작은 탑을 임시공간에 미리 이동시켜놔야함
System.out.println(from +" "+to);
Hanoi_Top(N-1,temp,from,to); // 임시공간에 이동한 탑들을 전부 목적지로 옮김
}
}
N개의 하노이탑을 옮기려면 N-1개의 탑을 빈 공간에 옮긴후, 제일 큰 탑을 목적지로 이동 후, 다시 빈공간에서 목적지로 N-1개를 옮겨야한다.
이는 N 개의 하노이 탑을 옮기기 위해서 N-1개의 하노이 탑을 옮기는걸 총 2번 반복해야된다는 소리고, 이는 재귀
로 분할해서 풀 수 있다.
재귀
O(N^2)
옮기는 과정을 써야해서 처음에는 스택으로 풀려다가 막혔다.
이후에 문제 유형을 확인하고 재귀로 풀었다!
없을 것 같다!