P,Q = map(int,input().split()) 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: while x%p==0: x = x//p D[x] = D.get(x,0)+1 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)