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 PYTHON3):

Solution:
from itertools import chain, combinations
from functools import reduce
from collections import defaultdict

def res(m,n):
    k = min(m,n)
    return (1+k)*(k+2*k**2-3*k*(m+n)+6*m*n) // 6

def powerset(iterable):
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

def prod(it):
    r = 1
    for elem in it:
        r *= elem
    return r

def factorGenerator(n):
    res = defaultdict(lambda: 0)
    for p in range(2,10**6+1):
        while n % p == 0:
            res[p] += 1
            n = n // p
    return res

def divisorGen(n):
    factors = list(factorGenerator(n).items())
    nfactors = len(factors)
    f = [0] * nfactors
    while True:
        yield reduce(lambda x, y: x*y, [factors[x][0]**f[x] for x in range(nfactors)], 1)
        i = 0
        while True:
            f[i] += 1
            if f[i] <= factors[i][1]:
                break
            f[i] = 0
            i += 1
            if i >= nfactors:
                return
def res2(x):
    r = []
    x6 = 6 * x
    divisors = set(divisorGen(x6))
    for m in divisors:
        a = x6 // m
        if a % (m+1) != 0:
            continue
        b = a // (m+1)
        c = b + m - 1
        if c % 3 != 0:
            continue
        n = c // 3
        if n < m:
            continue
        if res(m,n) != x:
            continue
        r.append((m,n))
    return r

x = int(input())
r = res2(x)
r = r + [(n,m) for m,n in r]
r = sorted(set(r))
print(len(r))
for (m,n) in r:
  print("%d %d"%(m, n))