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 codeforces.cfr332div2;

import java.math.BigInteger;
import java.util.LinkedList;
import java.util.Scanner;

/**
 * Created by raggzy on 3/13/2016.
 */
public class D {
    private static long f(long a, long b) {
        return a * (a * b + a + b + 1) - (a + b + 2) * a * (a + 1) / 2 + a * (a + 1) * (2 * a + 1) / 6;
    }

    private static long search(long a, long x) {
        BigInteger X = BigInteger.valueOf(x);
        BigInteger A = BigInteger.valueOf(a);
        BigInteger up = BigInteger.valueOf(6).multiply(X).add(A.multiply(A).multiply(A)).subtract(A);
        BigInteger down = BigInteger.valueOf(3).multiply(A).multiply(A.add(BigInteger.ONE));
        BigInteger[] res = up.divideAndRemainder(down);
        if (!res[1].equals(BigInteger.ZERO)) return 0;
        long b = res[0].longValue();
        if (b < a) return 0;
        return b;
    }

    private static class Pair {
        private final long a;
        private final long b;

        public Pair(long a, long b) {
            this.a = a;
            this.b = b;
        }
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        long x = in.nextLong();
        LinkedList<Pair> result1 = new LinkedList<>();
        LinkedList<Pair> result2 = new LinkedList<>();
        long maxA = 0;
        long sumSq = 0;
        while (sumSq < x) {
            maxA++;
            sumSq += maxA * maxA;
        }
        for (int a = 1; a <= maxA; a++) {
            long b = search(a, x);
            if (b > 0) {
                result1.addLast(new Pair(a, b));
                if (b > a) {
                    result2.addFirst(new Pair(b, a));
                }
            }
        }
        System.out.println(result1.size() + result2.size());
        for (Pair p : result1) {
            System.out.println(String.format("%d %d", p.a, p.b));
        }
        for (Pair p : result2) {
            System.out.println(String.format("%d %d", p.a, p.b));
        }
//        System.out.println(f(10000000, 10000000));
    }
}