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'; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ