Skip to main content

Cutting

BOJ 30449 Reafy ์ˆ˜์—ด

·273 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/30449 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # $R(n)$์˜ ๊ธธ์ด๋Š” ๋ช‡์ผ๊นŒ? $R(1) = 2$์ด๊ณ , $R(k) = R(k-1) + k$์™€ ์„œ๋กœ์†Œ์ธ ์ž์—ฐ์ˆ˜์˜ ๊ฐœ์ˆ˜ ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ์˜ค์ผ๋Ÿฌ ํ”ผํ•จ์ˆ˜์˜ ๋ถ€๋ถ„ํ•ฉ ๊ฐœ์ˆ˜๋ž‘ ๊ฐ™๋‹ค. ์•”ํŠผ ๋‚˜์ด๋ธŒํ•˜๊ฒŒ ๋Œ๋ ค๋ณด๋‹ˆ, 7600459๊ฐœ๊ฐ€ ๋‚˜์˜จ๋‹ค. ์ด๊ฑธ 0.5์ดˆ์•ˆ์— ์ด๊ฑธ ์ •๋ ฌํ•˜๊ณ  ์ฐพ์„?์ˆ˜?์žˆ์„๊นŒ? ใ…‹ใ…‹ ์ˆ˜์—ด์ด ์ขŒ์šฐ๋กœ ๋Œ€์นญ์ธ๊ฑธ ๊ณ ๋ คํ•˜๋ฉด 380๋งŒ๊ฐœ์ •๋„๋งŒ ์ •๋ ฌํ•ด๋„ ๋ ๊ฑฐ๊ฐ™๊ธด ํ•œ๋ฐ… ๊ทธ๋ž˜๋„ ๋นก์„ธ๋ณด์ธ๋‹ค. 0.5์ดˆ๋ผ์„œ ํ .. ๋‹ต์— ๋Œ€ํ•œ ์ด๋ถ„ํƒ์ƒ‰์ด ๋ ๊นŒ? ์‚ฌ์‹ค ๊น”๋”ํ•˜๊ฒŒ ์ด๋ถ„ํƒ์ƒ‰ ํ•˜๊ธฐ ์œ„ํ•ด์„ , ์ •์ˆ˜์กฐ๊ฑด์œผ๋กœ ๋ฐ”๊พธ๋ ค๋ฉด 1~5000์˜ LCM์„ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.. ์ง„์งœ ๊ฐœ์—๋ฐ” $10^{-4}$์— ๋Œ€ํ•œ ์ •๋ฐ€๋„๊นŒ์ง€๋งŒ ํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ? ํ•ด๋ดค์ž ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜๋Š” $\frac{1}{5000}$์ด๋‹ˆ๊นŒ… ๋ผ๊ธฐ์—” ๋‘ ๋ถ„์ˆ˜์˜ ์ฐจ๋Š” ๊ฒฐ๊ตญ ๋” ๋นก์„ธ์ง€๋„ค. ํ•ด๋ดค์ž $\frac{1}{5000*4999}$์ธ๊ฑฐ๊ฐ™๊ธด ํ•œ๋ฐ… ์•„๋‹ˆ ์ž ๊น๋งŒ, ์ƒ๊ฐํ•ด๋ณด๋‹ˆ๊นŒ 1~5000์— ๋Œ€ํ•ด์„œ ๋”ฐ๋กœ ์ •๋ ฌํ•˜๋ฉด ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ฝค๋‚˜ ์ค„์–ด๋“œ๋Š”๊ฒƒ๊ฐ™๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด์„œ ๋‹ต์— ๋Œ€ํ•œ ์ด๋ถ„ํƒ์ƒ‰์„ ํ•ด๋ณผ๊นŒ..? ๋‹ค ์‹คํŒจํ•˜๊ณ , nth_element์™€ short์™€ pragma Ofast์™€ Clang๊นŒ์ง€ ์„ž์€ ์ตœ์ ํ™”๋กœ ํ’€์—‡๋‹ค… ํ•˜ ์ด๊ฒŒ ๋ญํ•˜๋Š” ๋ฌธ์ œ๋ƒ ใ„ฑ- ํ—‰, ์•ž์— ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ „์ฒ˜๋ฆฌํ•˜๋ฉด ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ๋ˆ๋‹ค. ๊ฑฐ๊ธฐ๊ฐ€ ๋ณ‘๋ชฉ์ด์—ˆ๋‹ค๋‹ˆ ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N, K; cin >> N >> K; vector<pair<short,short>> v; v.reserve(N * N / 2); v.push_back({0, 1}); v.push_back({1, 1}); rep(i, 1, N+1) rep(j, i+1, N+1){ if(__gcd(i, j) != 1) continue; v.push_back({(short)i, (short)j}); } int sz = (int)v.size(); if(K*2 > sz){ K = sz - K + 1; nth_element(v.begin(), v.begin() + K - 1, v.end(), [](auto& a, auto& b){ return a.first * b.second > a.second * b.first; }); } else { nth_element(v.begin(), v.begin() + K - 1, v.end(), [](auto& a, auto& b){ return a.first * b.second < a.second * b.first; }); } cout << v[K-1].first << " " << v[K-1].second << '\n'; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ