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.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

public class D {

    public static void main(String[] args) {
        Kattio io = new Kattio(System.in,System.out);
        long temp1, temp2, pair;        
            long x=io.getLong();
            List<Value>answers=new ArrayList<Value>();
            for(long i=1;i<=x;i++){
                temp1 = x-i*(i+1)*(2*i+1)/6;    
                temp2 = i*(i+1);            
                temp2=temp2/2;
                //io.println("TEST"+temp1+" "+temp2);
                if (temp1<=-1)break;
                if (temp1 % temp2 == 0){
                    pair =i+(temp1/temp2);              
                    //io.println(pair+" "+i);
                    answers.add(new Value(i, pair));
                    if (i!=pair)
                        answers.add(new Value(pair, i));
                }               
            }
            Collections.sort(answers);io.println(answers.size());
            for(Value v:answers)io.println(v.x+" "+v.y);
            io.close();
    }
    static  class Value implements Comparable<Value>{
        long x,y;
        Value(long X, long Y){
        x=X;
        y=Y;
        }
        
        @Override
        public int compareTo(Value tuna){
        if(this.y!=tuna.y)
        return Long.compare(x,tuna.x);
        else
        return Long.compare(y,tuna.y);
        }
        }
static class Kattio extends PrintWriter {

    public Kattio(InputStream i) {
    super(new BufferedOutputStream(System.out));
    r = new BufferedReader(new InputStreamReader(i));
    }
    public Kattio(InputStream i, OutputStream o) {
    super(new BufferedOutputStream(o));
    r = new BufferedReader(new InputStreamReader(i));
    }

    public boolean hasMoreTokens() {
    return peekToken() != null;
    }

    public int getInt() {
    return Integer.parseInt(nextToken());
    }

    public double getDouble() { 
    return Double.parseDouble(nextToken());
    }

    public long getLong() {
    return Long.parseLong(nextToken());
    }

    public String getWord() {
    return nextToken();
    }



    private BufferedReader r;
    private String line;
    private StringTokenizer st;
    private String token;

    private String peekToken() {
    if (token == null) 
        try {
        while (st == null || !st.hasMoreTokens()) {
            line = r.readLine();
            if (line == null) return null;
            st = new StringTokenizer(line);
        }
        token = st.nextToken();
        } catch (IOException e) { }
    return token;
    }

    private String nextToken() {
    String ans = peekToken();
    token = null;
    return ans;
    }
}
}