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

public class Main {
	public static void main(String[] args)throws IOException{
		PrintWriter pw = new PrintWriter(System.out);
        InputReader in = new InputReader(System.in);
        
//        for(int i=1;i<=10;i++){
//        	for(int j=1;j<=10;j++){
//        		int count=0;
//        		
//        		for(int k=1;k<=Math.min(i, j);k++){
//        			count+=(i-k+1)*(j-k+1);
//        		}
//        		
//        		pw.println(i+" "+j+" "+count);
//        	}
//        }
        
        long x = in.nextLong();
        
        int maxAns = (int)Math.pow(x,0.34);
        maxAns*=2;
        
        ArrayList<Pair> a = new ArrayList<>();
        
        long i = 1;
        
        while(i<=maxAns){
        	if((x+((i*i*i-i*i)/2)-(i*(i-1)*(2*i-1)/6))%((i*i+i)/2)==0)
            {
                long n=(x+((i*i*i-i*i)/2)-(i*(i-1)*(2*i-1)/6))/((i*i+i)/2);
                if(i>n)
                    break;
                a.add(new Pair(i,n));
                if(i!=n)
                a.add(new Pair(n,i));
            }
            i++;
        }
        
        Collections.sort(a);
        System.out.println(a.size());
        for(Pair s:a){
//            String[] st = s.split(" ");
            pw.println(s.first+" "+s.second);
        }
        
        pw.close();
	}

	public static  class Pair implements Comparable<Pair>
    {
        long first,second;
        Pair(long first,long second)
        {
            this.second=second;
            this.first=first;
        }
        @Override
        public int compareTo(Pair o) {
            if(first!=o.first)
                return Long.compare(first, o.first);
            return Long.compare(second, o.second);
        }
        
        public int hashcode()
        {
            return 0;
        }
        
        public boolean equals(Object o)
        {
            return true;
        }
        
    }
	
static class InputReader {
		 
		private InputStream stream;
		private byte[] buf = new byte[8192];
		private int curChar;
		private int snumChars;
		private SpaceCharFilter filter;
 
		public InputReader(InputStream stream) {
			this.stream = stream;
		}
 
		public int snext() {
			if (snumChars == -1)
				throw new InputMismatchException();
			if (curChar >= snumChars) {
				curChar = 0;
				try {
					snumChars = stream.read(buf);
				} catch (IOException e) {
					throw new InputMismatchException();
				}
				if (snumChars <= 0)
					return -1;
			}
			return buf[curChar++];
		}
 
		public int nextInt() {
			int c = snext();
			while (isSpaceChar(c))
				c = snext();
			int sgn = 1;
			if (c == '-') {
				sgn = -1;
				c = snext();
			}
 
			int res = 0;
 
			do {
				if (c < '0' || c > '9')
					throw new InputMismatchException();
				res *= 10;
				res += c - '0';
				c = snext();
			} while (!isSpaceChar(c));
 
			return res * sgn;
		}
		
		public long nextLong() {
			int c = snext();
			while (isSpaceChar(c))
				c = snext();
			int sgn = 1;
			if (c == '-') {
				sgn = -1;
				c = snext();
			}
 
			long res = 0;
 
			do {
				if (c < '0' || c > '9')
					throw new InputMismatchException();
				res *= 10;
				res += c - '0';
				c = snext();
			} while (!isSpaceChar(c));
 
			return res * sgn;
		}
		
		public String readString() {
			int c = snext();
			while (isSpaceChar(c))
				c = snext();
			StringBuilder res = new StringBuilder();
			do {
				res.appendCodePoint(c);
				c = snext();
			} while (!isSpaceChar(c));
			return res.toString();
		}
 
		public boolean isSpaceChar(int c) {
			if (filter != null)
				return filter.isSpaceChar(c);
			return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
		}
 
		public interface SpaceCharFilter {
			public boolean isSpaceChar(int ch);
		}
	}
}