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.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Stack;
import java.util.StringTokenizer;


public class Main {
    

    
    
//    static int modpow(int a, int b, int n){
//        
//        int res = 1;
//        while(b>0){
//            if(b%2==1){
//                res = (res%n*a%n)%n;
//                
//            }
//            b = b>>1;
//            a = (a%n*a%n)%n;
//        }
//        return res;
//    }
    
    static long guy(long x, long a){
        
        long val = -1;
        long num = 6*x;
        long num1 = (a*(a-1)*(a+1));
        long   den = 3*a*(a+1);
//        BigInteger n1 = new BigInteger(String.valueOf(num));
//        BigInteger n2 = new BigInteger(String.valueOf(num1));
//        n1 = n1.add(n2);
//        BigInteger d = new BigInteger(String.valueOf(den));
//        if(!n1.mod(d).toString().equals(BigInteger.ZERO.toString()))    return -1;
//        val =  Long.parseLong(n1.divide(d).toString());
        if((num+num1)%den!=0)return -1;
        val = (num+num1)/den;
        return val;
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new PrintWriter(System.out));
        
        long n = Long.parseLong(br.readLine());
        int maxN = 3000000;
//        System.out.println(guy(n,4));
        HashMap<Integer, Integer> H = new HashMap();
        H.put(1, 1);
        int cnt = 1;
        ArrayList<String>  A = new ArrayList();
        A.add((1+" "+n));
        //System.out.println(2*Math.cbrt(n));
        for(int i=2;i<=2*Math.cbrt(n);i++){
            long y = guy(n,i);
            //System.out.println("here");
            if(y==-1 || y<i)    continue;
            else{
                if(H.containsKey(y))    break;
                else{
                    cnt+=1;
                    H.put(i, 1);
                    A.add((i+" "+y));
                }
            }
        }
        //System.out.println("done here");
        ArrayList<String> B = new ArrayList();
        
        for(int i=A.size()-1;i>=0;i--){
        
            String v = A.get(i);
            if(v.split(" ")[0].equals(v.split(" ")[1])) continue;
            else{
                B.add((v.split(" ")[1])+" "+v.split(" ")[0]);
            }
        }
        
        bw.append(A.size()+B.size()+"\n");
        for(int i=0;i<A.size();i++){
            bw.append(A.get(i)+"\n");
        }
        for(int i=0;i<B.size();i++){
            bw.append(B.get(i)+"\n");
        }
        
        
        
        bw.close();
    }

    
}