Skip to main content

Randomization

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; } πŸ”’ κ΅¬ν˜„ μ½”λ“œ 잠금