結果
問題 | No.2125 Inverse Sum |
ユーザー | tnakao0123 |
提出日時 | 2022-11-21 19:02:10 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 19 ms / 2,000 ms |
コード長 | 2,637 bytes |
コンパイル時間 | 745 ms |
コンパイル使用メモリ | 63,952 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-09-22 10:11:23 |
合計ジャッジ時間 | 1,967 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 2 ms
6,944 KB |
testcase_02 | AC | 2 ms
6,940 KB |
testcase_03 | AC | 2 ms
6,940 KB |
testcase_04 | AC | 2 ms
6,944 KB |
testcase_05 | AC | 2 ms
6,940 KB |
testcase_06 | AC | 2 ms
6,940 KB |
testcase_07 | AC | 2 ms
6,940 KB |
testcase_08 | AC | 2 ms
6,940 KB |
testcase_09 | AC | 2 ms
6,940 KB |
testcase_10 | AC | 2 ms
6,944 KB |
testcase_11 | AC | 2 ms
6,944 KB |
testcase_12 | AC | 2 ms
6,940 KB |
testcase_13 | AC | 2 ms
6,944 KB |
testcase_14 | AC | 2 ms
6,948 KB |
testcase_15 | AC | 2 ms
6,940 KB |
testcase_16 | AC | 2 ms
6,940 KB |
testcase_17 | AC | 2 ms
6,944 KB |
testcase_18 | AC | 2 ms
6,940 KB |
testcase_19 | AC | 2 ms
6,944 KB |
testcase_20 | AC | 2 ms
6,944 KB |
testcase_21 | AC | 2 ms
6,944 KB |
testcase_22 | AC | 2 ms
6,944 KB |
testcase_23 | AC | 2 ms
6,940 KB |
testcase_24 | AC | 2 ms
6,940 KB |
testcase_25 | AC | 2 ms
6,944 KB |
testcase_26 | AC | 2 ms
6,944 KB |
testcase_27 | AC | 19 ms
6,940 KB |
testcase_28 | AC | 15 ms
6,940 KB |
testcase_29 | AC | 9 ms
6,944 KB |
testcase_30 | AC | 2 ms
6,944 KB |
testcase_31 | AC | 15 ms
6,940 KB |
testcase_32 | AC | 4 ms
6,940 KB |
ソースコード
/* -*- coding: utf-8 -*- * * 2125.cc: No.2125 Inverse Sum - yukicoder */ #include<cstdio> #include<vector> #include<algorithm> #include<utility> using namespace std; /* constant */ const int MAX_P = 32000; /* typedef */ typedef long long ll; typedef vector<int> vi; typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef vector<pii> vpii; typedef vector<pll> vpll; /* global variables */ bool primes[MAX_P + 1]; /* subroutines */ int gen_primes(int maxp, vi &pnums) { fill(primes, primes + maxp + 1, true); primes[0] = primes[1] = false; int p; for (p = 2; p * p <= maxp; p++) if (primes[p]) { pnums.push_back(p); for (int q = p * p; q <= maxp; q += p) primes[q] = false; } for (; p <= maxp; p++) if (primes[p]) pnums.push_back(p); return (int)pnums.size(); } bool prime_decomp(int n, vi &pnums, vpii& pds) { pds.clear(); int pn = pnums.size(); for (int i = 0; i < pn; i++) { int pi = pnums[i]; if (pi * pi > n) { if (n > 1) pds.push_back(pii(n, 1)); return true; } if (n % pi == 0) { int fi = 0; while (n % pi == 0) n /= pi, fi++; pds.push_back(pii(pi, fi)); } } return false; } template <typename T> T gcd(T m, T n) { // m >= 0, n >= 0 if (m < n) swap(m, n); while (n > 0) { T r = m % n; m = n; n = r; } return m; } void printpds(vpii &pds) { int n = pds.size(); for (int i = 0; i < n; i++) printf("%d^%d%c", pds[i].first, pds[i].second, (i + 1 < n) ? '+' : '\n'); } ll powi(ll a, int b) { ll p = 1; while (b > 0) { if (b & 1) p *= a; a *= a; b >>= 1; } return p; } ll calc(vpii &pds, vi &es) { ll p = 1; for (int i = 0; i < pds.size(); i++) p *= powi(pds[i].first, es[i]); return p; } /* main */ int main() { vi pnums; gen_primes(MAX_P, pnums); int p, q; scanf("%d%d", &p, &q); int g = gcd(p, q); p /= g, q /= g; if (p > q * 2) { puts("0"); return 0; } // 1/n+1/m=p/q -> q(n+m)=pnm -> pn*pm-pn*q-pm*q=0 -> (pn-q)(pm-q)=q^2 vpii pds; prime_decomp(q, pnums, pds); for (auto &pd: pds) pd.second *= 2; //printpds(pds); ll qq = (ll)q * q; int n = pds.size(); vi es(n, 0); vpll ans; for (;;) { ll x = calc(pds, es); ll y = qq / x; if ((x + q) % p == 0 && (y + q) % p == 0) ans.push_back(pll((x + q) / p, (y + q) / p)); int k = 0; for (; k < n; k++) { if (++es[k] > pds[k].second) es[k] = 0; else break; } if (k >= n) break; } sort(ans.begin(), ans.end()); printf("%lu\n", ans.size()); for (auto &nm: ans) printf("%lld %lld\n", nm.first, nm.second); return 0; }