P,Q = map(int,input().split()) def gcd(a,b): if b==0:return a return gcd(b,a%b) d = gcd(P,Q) P //= d Q //= d A = list(range(10**5+1)) for i in range(2,10**5+1): if i*i>10**5:break for j in range(i*i,10**5+1,i): A[j] = A[i] B = [] for i in range(2,10**5+1): if A[i]==i: B.append(i) D = {} x = Q for p in B: if x==1:break while x%p==0: D[p] = D.get(p,0)+1 x //= p if x>1: D[x] = 1 def dfs(i,j,C,n): global F if i==len(C): F[j].append(n) return for k in range(D[C[i]]+1): n *= pow(C[i],k) dfs(i+1,j,C,n) n //= pow(C[i],k) return E = list(D.items()) J = len(D) ans = set() for i in range(1<>k)&1: C1.append(E[k][0]) else: C2.append(E[k][0]) F = [[],[]] dfs(0,0,C1,1) dfs(0,1,C2,1) for n in F[0]: for m in F[1]: if (Q//n+Q//m)%P==0: d = (Q//n+Q//m)//P ans.add((n*d,m*d)) ans = list(ans) print(len(ans)) for N,M in ans: print(N,M)