C++の練習を兼ねて, AtCoder Regular Contest 124 の 問題C (C – LCM of GCDs) を解いてみた.
■感想.
1. 問題C は, 方針が見えなかったので, 解説を参考にして, ようやく, AC版に到達出来た.
2. 個人的には, 全探索を使用するロジックが, 非常に面白い問題に感じた.
3. 引き続き, 時間を見つけて, 過去問の学習を進めていきたいと思う.
本家のサイト AtCoder Regular Contest 124 解説 の 各リンク を ご覧下さい.
■C++版プログラム(問題C/AC版).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
// 解き直し. // https://atcoder.jp/contests/arc124/editorial/2328 // C++(GCC 9.2.1) #include <bits/stdc++.h> using namespace std; using LL = long long; #define repex(i, a, b, c) for(int i = a; i < b; i += c) #define repx(i, a, b) repex(i, a, b, 1) #define rep(i, n) repx(i, 0, n) #define repr(i, a, b) for(int i = a; i >= b; i--) int a[55], b[55]; // 与えられた正の整数のすべての約数を抽出. // @param X: 約数を抽出したい正の整数. // @return ret: すべての約数(※1以上). set<int> div(int X){ set<int> ret; repx(d, 1, (int)sqrt(X) + 1){ if(!(X % d)){ ret.insert(d); if(d * d != X) ret.insert(X / d); } } return ret; } int main(){ // 1. 入力情報. int N; scanf("%d", &N); rep(i, N) scanf("%d %d", &a[i], &b[i]); // 2. a[0], b[0] の 約数. set<int> aDiv = div(a[0]); set<int> bDiv = div(b[0]); // 3. 全探索. LL ans = 0; for(auto &p : aDiv){ for(auto &q : bDiv){ int c = 0; rep(i, N){ // 以下の二通りのいずれか成立すれば良いはず. // a[i] が p の 倍数 かつ b が q の 倍数である場合. // a[i] が q の 倍数 かつ b が p の 倍数である場合. bool ok = false; if(a[i] % p == 0 && b[i] % q == 0) ok = true; if(a[i] % q == 0 && b[i] % p == 0) ok = true; if(ok) c++; } // 最大値更新. if(c == N){ LL pCur = (LL)p; LL qCur = (LL)q; LL gCur = __gcd(pCur, qCur); ans = max(ans, pCur / gCur * qCur); } } } // 4. 出力. printf("%lld\n", ans); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
[入力例] 2 2 15 10 6 [出力例] 10 ※AtCoderのテストケースより [入力例] 5 148834018 644854700 947642099 255192490 35137537 134714230 944287156 528403260 68656286 200621680 [出力例] 238630 ※AtCoderのテストケースより [入力例] 20 557057460 31783488 843507940 794587200 640711140 620259584 1901220 499867584 190122000 41414848 349507610 620259584 890404700 609665088 392918800 211889920 507308870 722352000 156850650 498904448 806117280 862969856 193607570 992030080 660673950 422816704 622015810 563434560 207866720 316871744 63057130 117502592 482593010 366954816 605221700 705015552 702500790 900532160 171743540 353470912 [出力例] 152594452160 ※AtCoderのテストケースより [入力例] 5 21021 84344 50297 63294 54516 141752 94900 57596 36344 52689 [出力例] 1001 [入力例] 25 3143903 52425315 45033975 5838677 46260287 44381925 30221640 18863418 26498611 46791405 54981945 2245645 22456450 52922655 29491470 1347387 4940419 47997810 3497805 40421610 26049482 5033700 6698475 26498611 5838677 37795860 22076010 51649835 2694774 37952550 10155780 21558192 25151224 51394275 45175725 26498611 52098964 43921485 33622740 23803837 44014642 11862090 3111750 898258 52098964 9761085 50289075 14821257 21558192 50525010 [出力例] 20210805 |
■参照サイト
AtCoder Regular Contest 124