#include #include int cmp_ll (const void *ap, const void *bp) { long long a = *(long long *)ap; long long b = *(long long *)bp; if (a < b) { return -1; } if (a > b) { return 1; } return 0; } int gcd (int a, int b) { if (a <= 0 || b <= 0) { return a+b; } if (a%b == 0) { return b; } return gcd(b, a%b); } int main () { int p = 0; int q = 0; int res = 0; int ans_cnt = 0; int tmp_cnt = 0; long long ans[3000000][2] = {}; int d = 0; int div[1500] = {}; int div_cnt = 0; res = scanf("%d", &p); res = scanf("%d", &q); d = gcd(p, q); p /= d; q /= d; for (int i = 1; i*i <= q; i++) { if (q%i == 0) { div[div_cnt] = i; div_cnt++; if (q/i != i) { div[div_cnt] = q/i; div_cnt++; } } } for (int i = 0; i < div_cnt; i++) { int d1 = div[i]; for (int j = 0; j < div_cnt; j++) { int d2 = div[j]; if ((q/d2)%d1 == 0 && (d1+d2)%p == 0) { long long mul = (long long) (q/(d1*d2)); mul *= (long long) ((d1+d2)/p); ans[tmp_cnt][0] = mul*((long long)d1); ans[tmp_cnt][1] = mul*((long long)d2); tmp_cnt++; } } } if (tmp_cnt <= 0) { printf("0\n"); return 0; } qsort(ans, tmp_cnt, sizeof(long long)*2, cmp_ll); ans_cnt = 1; for (int i = 1; i < tmp_cnt; i++) { if (ans[i-1][0] != ans[i][0]) { ans[ans_cnt][0] = ans[i][0]; ans[ans_cnt][1] = ans[i][1]; ans_cnt++; } } printf("%d\n", ans_cnt); for (int i = 0; i < ans_cnt; i++) { printf("%lld %lld\n", ans[i][0], ans[i][1]); } return 0; }