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.util.*;
import java.io.*;

public class D
{
   public static void main(String[] args) throws Exception
   {
      PrintWriter out = new PrintWriter(System.out);
      new D(new FastScanner(System.in), out);
      out.close();
   }

   public D(FastScanner in, PrintWriter out)
   {
      long x = in.nextLong();

      ArrayDeque<long[]> res = new ArrayDeque<>();
      for (long a=1; a<10_000_000; a++)
      {
         long xx = x;
         xx -= a*a;
         xx -= a;

         long sum1 = (2*a+1)*a*(a+1)/6;
         long sum2 = -a*(a+1);
         long sum3 = -a*a*(a+1)/2;
         xx -= sum1;
         xx -= sum2;
         xx -= sum3;
     
         long bot = a*a+a-(a*(a+1)/2);
         //System.out.printf("%d: %d %d%n", a, xx, bot);
         
         if (xx % bot == 0)
         {
            long b = xx/bot;
            if (a <= b)
            {
               res.add(new long[]{a, b});
            }
         }
      }

      ArrayDeque<long[]> rev = new ArrayDeque<>();
      for (long[] v : res)
         if (v[0] != v[1])
            rev.push(v);
   
      out.println(res.size()+rev.size());
      for (long[] v : res)
         out.printf("%d %d%n", v[0], v[1]);
      while (rev.size() > 0)
      {
         long[] v = rev.pop();
         out.printf("%d %d%n", v[1], v[0]);
      }


   }
}

class FastScanner{
   private InputStream stream;
   private byte[] buf = new byte[1024];
   private int curChar;
   private int numChars;

   public FastScanner(InputStream stream)
   {
      this.stream = stream;
   }

   int read()
   {
      if (numChars == -1)
         throw new InputMismatchException();
      if (curChar >= numChars){
         curChar = 0;
         try{
            numChars = stream.read(buf);
         } catch (IOException e) {
            throw new InputMismatchException();
         }
         if (numChars <= 0)
            return -1;
      }
      return buf[curChar++];
   }

   boolean isSpaceChar(int c)
   {
      return c==' '||c=='\n'||c=='\r'||c=='\t'||c==-1;
   }
   
   boolean isEndline(int c)
   {
      return c=='\n'||c=='\r'||c==-1;
   }

   int nextInt()
   {
      return Integer.parseInt(next());
   }
   
   long nextLong()
   {
      return Long.parseLong(next());
   }

   double nextDouble()
   {
      return Double.parseDouble(next());
   }

   String next(){
      int c = read();
      while (isSpaceChar(c))
         c = read();
      StringBuilder res = new StringBuilder();
      do{
         res.appendCodePoint(c);
         c = read();
      }while(!isSpaceChar(c));
      return res.toString();
   }
   
   String nextLine(){
      int c = read();
      while (isEndline(c))
         c = read();
      StringBuilder res = new StringBuilder();
      do{
         res.appendCodePoint(c);
         c = read();
      }while(!isEndline(c));
      return res.toString();
   }
}