Problem: Spongebob is already tired trying to reason his weird actions and calculations, so he simply asked you to find all pairs of n and m, such that there are exactly x distinct squares in the table consisting of n rows and m columns. For example, in a 3 × 5 table there are 15 squares with side one, 8 squares with side two and 3 squares with side three. The total number of distinct squares in a 3 × 5 table is 15 + 8 + 3 = 26.

Input

The first line of the input contains a single integer x (1 ≤ x ≤ 1018) — the number of squares inside the tables Spongebob is interested in.

Output

First print a single integer k — the number of tables with exactly x distinct squares inside.

Then print k pairs of integers describing the tables. Print the pairs in the order of increasing n, and in case of equality — in the order of increasing m.

Examples

Input

26


Output

6
1 26
2 9
3 5
5 3
9 2
26 1


Input

2


Output

2
1 2
2 1


Input

8


Output

4
1 8
2 3
3 2
8 1

Note

In a 1 × 2 table there are 2 1 × 1 squares. So, 2 distinct squares in total.

<image>

In a 2 × 3 table there are 6 1 × 1 squares and 2 2 × 2 squares. That is equal to 8 squares in total.

<image>

Solution (in JAVA):

Solution:
import java.io.*;
import java.math.*;
import java.util.*;

public class Main {

	public static void main(String[] args) throws Exception {
		Scanner in = null;
		PrintWriter out = null;

		in = new Scanner(System.in);
		out = new PrintWriter(System.out);


		long  k=in.nextLong();
	
		BigInteger kb=BigInteger.valueOf(k);
		BigInteger mx = BigInteger.ONE;
	
		BigInteger ms = BigInteger.ZERO;
		ArrayList<Long> ansX = new ArrayList<Long>();
		ArrayList<Long> ansY = new ArrayList<Long>();
		for (long i = 1;; i++) {
			BigInteger ib= BigInteger.valueOf(i);
			if (kb.add(ms).compareTo(mx)<0)
				break;
			if (ib.compareTo(kb.add(ms).divide(mx))>0)
				break;
			if ((kb.add(ms)).mod(mx) == BigInteger.ZERO) {
	
				ansX.add(i);
				ansY.add(kb.add(ms).divide(mx).longValue());
			}
			
			mx = mx.add(ib.add(BigInteger.ONE));
			ms =BigInteger.ONE;
			for(int j=0;j<3;j++){
				ms=ms.multiply(ib);
				ib=ib.add(BigInteger.ONE);
			}
			ms=ms.divide(BigInteger.valueOf(6));
		}
	
		int cnt = ansX.size()*2;
		if( ansX.size()!=0 && ansX.get(ansX.size()-1).equals(ansY.get(ansY.size()-1)))cnt--;
		out.println(cnt);
		for(int i=0;i<ansX.size();i++)
			out.println(ansX.get(i)+" "+ansY.get(i));;
			int l = ansX.size();
		if( ansX.size()!=0 && ansX.get(ansX.size()-1).equals(ansY.get(ansY.size()-1)))l--;
		for(int i=l-1;i>=0;i--)
			out.println(ansY.get(i)+" "+ansX.get(i));;
		in.close();
		out.close();
	}
}