#include <stdio.h>#include <string.h>#include <math.h>#include <algorithm>using namespace std;#define ll unsigned long long#define maxn 2642246#define L 5000001ll n;ll prime[L],divi[500],e[500];int len,len_prime,len_s;bool flag[L] = {false};struct node{ ll x,y;} s[1005];int cmp(node x,node y){ return x.x<y.x;}void init(){ int i,j; len_prime = 0; for(i = 2; i<L; i++) { if(!flag[i]) prime[len_prime++] = i; for(int j = 0; j<len_prime && i*prime[j]<L; j++) { flag[i*prime[j]] = true; if(i%prime[j]==0) break; } }}void find_div(ll m){ int i; ll k; len = 0; for(i = 0; i<len_prime && prime[i]*prime[i]<=m; i++) { if(m%prime[i] == 0) { divi[len] = prime[i]; k = 1; m/=prime[i]; while(m%prime[i] == 0) { k++; m/=prime[i]; } e[len++] = k; } } if(m>1) { divi[len] = m; e[len++] = 1; }}ll can_sqrt(ll c){ ll r = sqrt(1.0*c); if(r*r == c) return r; return L;}int judge(ll x,ll y){ for(int i=0; i<len_s; i++) if(s[i].x==x&&s[i].y==y) return 1; return 0;}void solve(ll t){ ll x1,x2; ll k = n/t; ll r = t*t-k; if(r>0 && r%3!=0) return ; r/=3; ll dis = t*t-4*r; if(dis<0) return ; ll c = can_sqrt(dis); if(c == L) return; if((t+c)%2 == 0) { x1 = (t+c)/2; x2 = t-x1; if(x1>x2) swap(x1,x2); if(x1>0&&x1<t&&x1<maxn&&x2<maxn&&x2>0&&x2<t&&!judge(x1,x2)) { s[len_s].x=x1; s[len_s++].y=x2; } } if((t-c)>0 && (t-c)%2 == 0) { x1 = (t-c)/2; x2 = t-x1; if(x1>x2) swap(x1,x2); if(x1>0&&x1<t&&x1<maxn&&x2<maxn&&x2>0&&x2<t&&!judge(x1,x2)) { s[len_s].x=x1; s[len_s++].y=x2; } }}ll ppow(ll a,ll b){ ll ans = 1; while(b) { if(b&1) ans*=a; b>>=1; a*=a; } return ans;}void dfs(int m,ll sum){ solve(sum); if(m>=len) return ; for(int i = 0; i<=e[m]; i++) dfs(m+1,sum*ppow(divi[m],i));}int main(){ init(); while(~scanf("%llu",&n)) { find_div(n); len_s = 0; dfs(0,1); sort(s,s+len_s,cmp); printf("%d",len_s); for(int i = 0; i<len_s; i++) printf(" (%llu,%llu)",s[i].x,s[i].y); printf("n"); } return 0;}