Skip to main content

Number_Theory

BOJ 15309 ์Šคํ‚ฌ ํŠธ๋ฆฌ

·373 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/15309 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์ด์ง„ํŠธ๋ฆฌ..๋Š” ์•„๋‹ˆ๊ณ  ์‚ผ๊ฐํ˜•์ด๊ตฌ๋‚˜. ๊ฑ ์ข€ ํŽด์„œ ์ƒ๊ฐํ•˜๋ฉด, ์ดํ•ญ๊ณ„์ˆ˜์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. $i$๋ฒˆ์งธ ์ค„์€ $(Ax + B)^i$ ์˜ ๊ณ„์ˆ˜์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜๋ฉด ๋˜๋Š”๋“ฏ? ์•„ ๊ทผ๋ฐ ๊ทธ ๋ญ๋ƒ ๊ฒน์น˜๊ฒŒ ํ•˜๋ฉด ์•ˆ๋˜๋Š”๊ตฌ๋‚˜ ํŠน์ • ์‚ผ๊ฐํ˜•์€ ๊ทธ ์ดˆํ•ญ๋งŒ ์ƒ๊ฐํ•˜๋ฉด ๋˜๋Š”๊ฒƒ๊ฐ™์œผ๋‹ˆ๊นŒ, $m$๊ฐœ์˜ ํ–‰์„ ํฌํ•จํ•˜๋Š” ์ •์‚ผ๊ฐํ˜•์„ ์–ด๋–ป๊ฒŒ ๊ณ„์‚ฐํ• ์ง€ ์ƒ๊ฐํ•ด๋ณด์ž. ๋Œ€์ถฉ ๋กœ๊ทธ์ •๋„์— ๊ณ„์‚ฐํ•˜๋ฉด ๋˜๋Š”๋ฐ.. ์ผ๋‹จ ์ดˆํ•ญ์ด 1์ผ๋•Œ ์‹์€ ๋ญ๋ž‘ ๊ฐ™์ง€? $1 + (A+B) + (A^2 + AB + B^2) + \cdots$ ๊ฐ™์€ ๋А๋‚Œ์ธ๊ฑด๋ฐ… ์–ด์ฐจํ”ผ ํ–‰ ์ž์ฒด์—๋Š” ๋ˆ„์ ํ•ฉ ๋ง›์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๊ฒ ๋„ค. ์–ด๋ผ? ์ด๊ฑด ๊ทธ๋ƒฅ ์œ— ํ–‰์—๋‹ค๊ฐ€ $A$๋ฅผ ๊ณฑํ•˜๊ณ , $B^N$๋งŒ ๋”ํ•˜๋ฉด ๋ ๊ฑฐ๊ฐ™์€๋”ฉ. ๋Œ€์ถฉ ํ•ด๋ฒ„๋ฆฌ์ฃ ? ์•„๋‹ˆ ์ž ๊น๋งŒ!!!!!!!!! $m$์ด $10^{18}$์ด๋‹ค!! ๋น„์ƒ!!!!!!!!! ๋กœ๊ทธ๊ฐ€ ๋ถ™์„๋งŒํ•œ๊ณณ์€ ๋ถ„ํ• ์ •๋ณต ๊ฑฐ๋“ญ์ œ๊ณฑ๊ฐ™์€๊ฑฐ๋ฐ–์— ์—†๋Š”๋ฐ… ์•„ ์ž ๊น๋งŒ. ์ด๊ฑฐ ๊ทธ๋ƒฅ ๊ทธ ์œ ๋ช…ํ•œ ๊ณ ๋”ฉ๋•Œ ๊ทธ ๊ณต์‹์ฒ˜๋Ÿผ $(A-B)$๊ณฑํ•˜๋ฉด ์ •๋ฆฌ๋˜๋Š” ๊ผด ์•„๋‹Œ๊ฐ€? ๊ทธ๋Ÿฌ๋ฉด $(A-B) + (A^2 - B^2) + (A^3 - B^3) + \cdots$ ์ด๊ฑด $(A + A^2 + \cdots + A^m) - (B + B^2 + \cdots + B^m)$์ด์ž๋‚˜! $\frac{A^{m+1} - 1}{A-1} - \frac{B^{m+1} - 1}{B-1}$ ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๊ณ , ์ด๊ฑธ $A-B$๋กœ ๋‚˜๋ˆ ์„œ ๋๋‚ด์ž. ์•„!! $A = B$์ธ ๊ฒฝ์šฐ๋ฅผ ์กฐ์‹ฌํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๊ณ , $A = 1$์ด๋‚˜ $B = 1$์ธ๊ฒฝ์šฐ๋„ ์กฐ์‹ฌํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค. $A = B$๋ผ๋ฉด? $1 + 2A + 3A^2 + \cdots + mA^{m-1}$ ๋ฅผ ๊ตฌํ•ด์•ผํ•˜๋Š”๋ฐ, ์ € ํ•ฉ์„ $S$๋ผ๊ณ  ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด $AS - S = 1 + A + A^2 + \cdots + A^m$ ๋‹ˆ๊นŒ, $A = 1$์ธ ๊ฒฝ์šฐ ๋ง๊ณ ๋Š” ์ด๊ฑธ ๊ตฌํ•ด์„œ $A-1$๋กœ ๋‚˜๋ˆ„๋ฉด ๋  ๊ฒƒ ๊ฐ™์€๋ฐ? ์ผ€์ด์Šค ์ฒ˜๋ฆฌ๋ฅผ ์กฐ์‹ฌํ•˜์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ mint A, B; cin >> A >> B; int Q; cin >> Q; while(Q--){ ll x, y, m; cin >> x >> y >> m; x--; y--; mint cho = 1; cho *= A.pow(x-y); cho *= B.pow(y); mint trig = 0; if(A == B){ if(A == 1) trig = mint(m)*(m+1)/2; else trig = (A.pow(m+1) - 1) / (A - 1).pow(2); } else{ if(A == 1) trig += m; else trig += (A.pow(m+1) - 1) / (A - 1) - 1; if(B == 1) trig -= m; else trig -= (B.pow(m+1) - 1) / (B - 1) - 1; trig /= (A-B); } cout << cho * trig << '\n'; } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 34088 It's a Mod, Mod, Mod, Mod World 2

·279 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/34088 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # $K$๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๊ฐ€ ๊ฐ™๋‹ค = ๊ณ ๋ฅธ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ์›์†Œ๋“ค์˜ ์ฐจ์ด๊ฐ€ ๋ชจ๋‘ $K$์˜ ๋ฐฐ์ˆ˜์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด? ๋ถ„์œ„๊ธฐ์ƒ ์†Œ์ˆ˜๋งŒ? ์‹ ๊ฒฝ์จ๋„ ๋˜๋Š”๊ฑฐ๊ฐ™๋‹ค. ๊ทผ๋ฐ ์ˆซ์ž๋“ค์˜ ์ฐจ์ด๊ฐ€ $10^9$๊นŒ์ง€์ธ๋ฐ… ๊ทธ๋Ÿฌ๋ฉด ๋„ˆ๋ฌด ๋งŽ์€๋ฐ ํ  ๊ทผ๋ฐ ์ผ๋‹จ ์ง๊ด€์ ์œผ๋กœ, $K = 2$์ผ๋•Œ ๋น„๋‘˜๊ธฐ์ง‘์˜ ์›๋ฆฌ์— ์˜ํ•ด ๋‹ต์€ ${N/2}$ ์ด์ƒ์ด๊ธด ํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง๊ด€์ ์œผ๋กœ, ์›ฌ๋งŒํ•œ ๊ฒฝ์šฐ์— $K$๊ฐ€ ์ž‘์„๋•Œ ๋‹ต์ด ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. $K$๊ฐ€ ํด๋•Œ๋ฅผ ์–ต์ง€๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‚˜? $K > 1000$ ์ฏค๋“ธ๋Š” ์–ด๋–ค ์†Œ์ˆ˜๋ผ๊ณ  ํ•˜๋ฉด, ์–ต์ง€๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๊ธด ํ•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์ด๋•Œ $K$๊ฐ€ $N/2$๊ฐœ ์ด์ƒ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์— ๋Œ€ํ•ด ๋‚˜๋จธ์ง€๊ฐ€ ๊ฐ™์•„์•ผํ•˜๋ฏ€๋กœ, ๋‹ค๋ฅด๊ฒŒ ๋งํ•˜๋ฉด ์–ด๋–ค ๋‘ ์ˆ˜๋ฅผ ๋ฝ‘์•—์„๋•Œ 50% ์ด์ƒ์˜ ํ™•๋ฅ ๋กœ $K$๋Š” ํ•ด๋‹น ์ˆ˜์˜ ์•ฝ์ˆ˜์ด๋‹ค. ๋žœ๋ค์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ? ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ auto start = chrono::high_resolution_clock::now(); bitset<32000> isPrime; isPrime.set(); isPrime[0] = isPrime[1] = 0; rep(i, 2, 32000) if(isPrime[i]){ for(ll j = (ll)i*i; j < 32000; j += i) isPrime[j] = 0; } vector<int> primes; rep(i, 2, 32000) if(isPrime[i]) primes.push_back(i); int N; cin >> N; vector<ll> A(N); rep(i, 0, N) cin >> A[i]; int ans = (N+1)/2; while(1){ auto end = chrono::high_resolution_clock::now(); auto duration = chrono::duration_cast<chrono::milliseconds>(end - start); if(duration.count() > 900) break; int a = rand() % N, b = rand() % N; int diff = abs(A[a] - A[b]); vector<int> divs; for(int p: primes){ if(p*p > diff) break; if(diff % p == 0){ divs.push_back(p); while(diff % p == 0) diff /= p; } } if(diff > 1) divs.push_back(diff); for(int d: divs){ map<int, int> mp; for(auto x: A) mp[x%d]++; for(auto [_, c]: mp) ans = max(ans, c); } } cout << ans; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 25229 GCD Harmony

·670 words·4 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/25229 ๋ฒˆ์—ญ ๋ฒˆ์—ญ # ๋ฌธ์ œ # ๋ฐฉํ–ฅ์ด ์—†๋Š” ๊ฐ„์„ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ฐ ๋…ธ๋“œ๋Š” ์ •์ˆ˜ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์ ‘ํ•œ ๋‘ ๋…ธ๋“œ์˜ ๊ฐ’์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜(GCD)๊ฐ€ $1$๋ณด๋‹ค ์—„๋ฐ€ํžˆ ํด ๋•Œ, ์ด ๋‘ ๋…ธ๋“œ๋ฅผ **GCD-์กฐํ™”๋กญ๋‹ค(GCD-harmonic)**๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

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'; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 12858 Range GCD

·247 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/12858 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # $\text{gcd}(n, n+1)$์€ ๋ช‡์ผ๊นŒ? $G = gcd(n, n+1)$์ด ์–ด๋–ค ์†Œ์ˆ˜ $p$๋ฅผ ์•ฝ์ˆ˜๋กœ ๊ฐ€์ง„๋‹ค๊ณ  ํ•˜์ž. ์ด๋•Œ $p$๋Š” ๊ฐ„๊ฒฉ $p$๋งˆ๋‹ค ํ•œ๊ฐœ์”ฉ ์กด์žฌํ•œ๋‹ค. $p = 2$๋ฉด $p$๋ฅผ ์•ฝ์ˆ˜๋กœ ๊ฐ€์ง„ ์ˆ˜๋Š” $2$์นธ๋งˆ๋‹ค ์กด์žฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฐ์†๋œ ๋‘ ์ˆ˜๋Š” ์–ด๋–ค ๊ณต์•ฝ์ˆ˜์ธ ์†Œ์ˆ˜ $p$๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค! ๋”ฐ๋ผ์„œ $\text{gcd}(n, n+1) = 1$์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ, $\text{gcd}(a, b) = \text{gcd}(a, b-a)$ ์ž„๋„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์—์„œ๋„ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด! ๊ตฌ๊ฐ„ ์ฟผ๋ฆฌ์ง€๋งŒ, Lazyํ•˜๊ฒŒ ์—ฐ์‚ฐํ•˜๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š์•„๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ $\text{gcd}(x_a, x_{a+1}, x_{a+2}, \dots, x_b)$ ๋ฅผ $\text{gcd}(x_a, x_{a+2} - x_{a+1}, x_{a+3} - x_{a+2}, \dots, x_b - x_{b-1})$ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด, ๋ฐ”๋€Œ๋Š” ์ˆ˜๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์ง€ ์•Š๋‹ค! Lazyํ•œ ํ•ฉ ์—ฐ์‚ฐ๊ณผ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜์— ๋Œ€ํ•œ ๊ทธ๋ƒฅ ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋กœ ํ’€ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ? ์‚ฌ์‹ค Lazy๋ถ€๋ถ„๋„ ๊ตฌ๊ฐ„ ๋ง์…ˆ, ์  ์ฟผ๋ฆฌ์ด๋ฏ€๋กœ ๊ทธ๋ƒฅ ์„ธ๊ทธ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ท€์ฐฎ์œผ๋‹ˆ๊นŒ ใ…‹ใ…‹ ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N; cin >> N; LazySegmentTree LST(N); ST.init(N-1); vector<ll> A(N); rep(i, 0, N) cin >> A[i]; rep(i, 0, N) LST.set(i, A[i]); LST.build(); rep(i, 0, N-1) ST.set(i, abs(A[i+1] - A[i])); ST.build(); int Q; cin >> Q; while(Q--){ ll op, a, b; cin >> op >> a >> b; a--; b--; if(op){ LST.update(a, b, op); if(a-1 >= 0) ST.update(a-1, abs(LST.query(a-1, a-1) - LST.query(a, a))); if(a+1 < N) ST.update(a, abs(LST.query(a+1, a+1) - LST.query(a, a))); }else{ cout << gcd(LST.query(a, a), ST.query(a, b-1)) << '\n'; } } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ