結果
| 問題 |
No.2125 Inverse Sum
|
| コンテスト | |
| ユーザー |
chro_96
|
| 提出日時 | 2022-11-19 12:12:15 |
| 言語 | C (gcc 13.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 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 30 |
ソースコード
#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;
}
chro_96