·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'; } } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·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; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·670 words·4 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/25229 ๋ฒ์ญ ๋ฒ์ญ # ๋ฌธ์ # ๋ฐฉํฅ์ด ์๋ ๊ฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ํธ๋ฆฌ๊ฐ ์์ผ๋ฉฐ, ๊ฐ ๋
ธ๋๋ ์ ์ ๊ฐ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ธ์ ํ ๋ ๋
ธ๋์ ๊ฐ์ ์ต๋๊ณต์ฝ์(GCD)๊ฐ $1$๋ณด๋ค ์๋ฐํ ํด ๋, ์ด ๋ ๋
ธ๋๋ฅผ **GCD-์กฐํ๋กญ๋ค(GCD-harmonic)**๊ณ ํฉ๋๋ค.
·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'; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·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'; } } } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ