#include #include typedef struct list { int v; struct list *n; } list; 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 func (int p, int q, int idx, int b1, int b2, int primes_cnt, list **b_inv, int ans_cnt, long long ans[][2]) { if (idx >= primes_cnt) { list *l1 = b_inv[b1]; while (l1 != NULL) { int d1 = l1->v; list *l2 = b_inv[b2]; while (l2 != NULL) { int d2 = l2->v; if ((d1+d2)%p == 0) { long long mul = (long long) (q/(d1*d2)); mul *= (long long) ((d1+d2)/p); ans[ans_cnt][0] = mul*((long long)d1); ans[ans_cnt][1] = mul*((long long)d2); ans_cnt++; } l2 = l2->n; } l1 = l1->n; } return ans_cnt; } ans_cnt = func(p, q, idx+1, b1, b2, primes_cnt, b_inv, ans_cnt, ans); ans_cnt = func(p, q, idx+1, (b1|(1< 1) { primes[primes_cnt] = tmp; primes_cnt++; } for (int i = 0; i < div_cnt; i++) { int b = 0; for (int j = 0; j < primes_cnt; j++) { if (div[i]%primes[j] == 0) { b |= (1<