結果
問題 | No.2125 Inverse Sum |
ユーザー | chro_96 |
提出日時 | 2022-11-19 12:12:15 |
言語 | C (gcc 12.3.0) |
結果 |
AC
|
実行時間 | 25 ms / 2,000 ms |
コード長 | 2,923 bytes |
コンパイル時間 | 238 ms |
コンパイル使用メモリ | 31,852 KB |
実行使用メモリ | 33,752 KB |
最終ジャッジ日時 | 2024-09-20 13:07:56 |
合計ジャッジ時間 | 2,118 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 10 ms
33,152 KB |
testcase_01 | AC | 11 ms
33,124 KB |
testcase_02 | AC | 11 ms
33,024 KB |
testcase_03 | AC | 10 ms
33,004 KB |
testcase_04 | AC | 11 ms
33,224 KB |
testcase_05 | AC | 11 ms
33,136 KB |
testcase_06 | AC | 11 ms
33,152 KB |
testcase_07 | AC | 10 ms
33,152 KB |
testcase_08 | AC | 10 ms
33,152 KB |
testcase_09 | AC | 10 ms
33,132 KB |
testcase_10 | AC | 9 ms
33,132 KB |
testcase_11 | AC | 10 ms
33,152 KB |
testcase_12 | AC | 10 ms
33,196 KB |
testcase_13 | AC | 24 ms
33,152 KB |
testcase_14 | AC | 11 ms
33,024 KB |
testcase_15 | AC | 10 ms
33,176 KB |
testcase_16 | AC | 10 ms
33,152 KB |
testcase_17 | AC | 11 ms
33,200 KB |
testcase_18 | AC | 9 ms
33,168 KB |
testcase_19 | AC | 11 ms
33,024 KB |
testcase_20 | AC | 11 ms
33,168 KB |
testcase_21 | AC | 11 ms
33,024 KB |
testcase_22 | AC | 10 ms
33,136 KB |
testcase_23 | AC | 10 ms
33,024 KB |
testcase_24 | AC | 9 ms
33,132 KB |
testcase_25 | AC | 9 ms
33,152 KB |
testcase_26 | AC | 10 ms
33,024 KB |
testcase_27 | AC | 25 ms
33,752 KB |
testcase_28 | AC | 23 ms
33,592 KB |
testcase_29 | AC | 17 ms
33,224 KB |
testcase_30 | AC | 10 ms
33,024 KB |
testcase_31 | AC | 23 ms
33,476 KB |
testcase_32 | AC | 11 ms
32,992 KB |
ソースコード
#include <stdio.h> #include <stdlib.h> 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<<idx)), b2, primes_cnt, b_inv, ans_cnt, ans); ans_cnt = func(p, q, idx+1, b1, (b2|(1<<idx)), primes_cnt, b_inv, ans_cnt, ans); return ans_cnt; } int main () { int p = 0; int q = 0; int res = 0; int ans_cnt = 0; int tmp_cnt = 0; long long ans[2000000][2] = {}; int d = 0; int div[1500] = {}; int div_cnt = 0; list l[1500] = {}; list *b_inv[5000] = {}; int tmp = 0; int primes[12] = {}; int primes_cnt = 0; res = scanf("%d", &p); res = scanf("%d", &q); d = gcd(p, q); p /= d; q /= d; tmp = q; 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++; } } } tmp = q; for (int i = 2; i*i <= q; i++) { if (tmp%i == 0) { primes[primes_cnt] = i; primes_cnt++; while (tmp%i == 0) { tmp /= i; } } } if (tmp > 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<<j); } } l[i].v = div[i]; l[i].n = b_inv[b]; b_inv[b] = l+i; } tmp_cnt = func(p, q, 0, 0, 0, primes_cnt, b_inv, 0, ans); 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; }