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:
//package coding;

import java.io.*;
import java.util.*;

public class Main{
    public static void main(String[] args) throws Exception {
    	Scanner in=new Scanner(System.in);
        StringBuilder sb = new StringBuilder(100000);
        long x=in.nextLong(), k=0,p=0,n;
        Vector<pair> v=new Vector<pair>();
        
        for(n=1; n<=(int)2e6+1; n++){
            p = 6*x + n*n*n - n; 
            k=3*n + 3*n*n;
          //  System.out.println(p+"  "+k);
            
        if(n > p/k) 
            break;
        if(p%k == 0)
            v.add(new pair(n, p/k));
        
    }
       
    int j=v.size();
     if(v.get(j-1).fi == v.get(j-1).se){
        System.out.printf("%d\n", 2*j-1);
    for(int i=0; i<v.size(); i++){
        sb.append(v.get(i).fi).append(' ').append(v.get(i).se).append('\n');
    }    
        for(int i=v.size()-2; i>=0; i--)
             sb.append(v.get(i).se).append(' ').append(v.get(i).fi).append('\n');
    }
    else{
        System.out.printf("%d\n", 2*j);
        for(int i=0; i<v.size(); i++)
             sb.append(v.get(i).fi).append(' ').append(v.get(i).se).append('\n');
        for(int i=v.size()-1; i>=0; i--)
            sb.append(v.get(i).se).append(' ').append(v.get(i).fi).append('\n');
        }
        
        System.out.print(sb);
    }
}
class pair{
    long fi,se;
    pair(long x, long y){
        fi=x; se=y;
    }
}