Codeforces Round 730

July 08, 2021

콘테스트 기록

A, B는 어렵지 않게 풀었다. C는 실수가 나와서 당황했는데, 어쨌든 오차가 아주 중요한 문제는 아니었다. D는 interactive형 문제였는데, 처음 보는 형태라서 조금 얼탔다. E는 튜토리얼을 읽고 업솔빙 중이다. A는 00:05에, B는 00:11에, C는 00:39에, D1은 01:05에, D2는 01:38에 풀었다. E는 풀지 못했다.

최종적으로 58위가 되었고, 아주 좋은 결과라고 생각한다.

1543A Exciting Bets

bab - a는 불변량이다. a=ba = b이면 a,ba, b를 증가시킬 때 흥분excitement도 항상 증가하고, 팬들은 무한한 흥분을 얻는다. d=ba>0d = |b - a| > 0일 때, a,ba, b를 조작하여 모두 dd의 배수가 되도록 하였을 때 gcd(a,b)=d\gcd(a, b) = d이다. dd보다 큰 수 dd'에 대해 a,ba, bdd'로 나눈 나머지가 다르므로 이는 a,ba, b의 최대공약수가 될 수 없다. 따라서 흥분의 최댓값은 dd가 된다. a,ba, bdd의 배수에 이르기까지 조작이 덜 필요한 쪽을 선택하여 증가시키거나 감소시키면 된다.

1543B Customising the Track

aia_i가 오름차순으로 정렬되어 있다고 가정하자. ana12a_n - a_1 \ge 2인 경우, a1,ana_1, a_n을 각각 a1+1,an1a_1 + 1, a_n - 1으로 바꾸었다고 하자. ai=a1a_i = a_1을 만족하는 ii의 최댓값을 pp, aj=ana_j = a_n을 만족하는 ii의 최솟값을 qq라고 하자. ana1>0a_n - a_1 > 0이므로 p<qp < q이다. 값을 변경하였을 때 불편inconvenience의 변화량을 다음과 같이 계산할 수 있다.

j=2n1a1+1aj=p1+j=p+1n1a1ajn+p+1\sum_{j = 2}^{n - 1} |a_1 + 1 - a_j| = p - 1 + \sum_{j = p + 1}^{n - 1} |a_1 - a_j| - n + p + 1 j=2n1ajan+1=nq1+j=2q1ajanq+2\sum_{j = 2}^{n - 1} |a_j - a_n + 1| = n - q - 1 + \sum_{j = 2}^{q - 1} |a_j - a_n| - q + 2 a1+1an+1=a1an2|a_1 + 1 - a_n + 1| = |a_1 - a_n| - 2 a1a1+1a_1 \leftarrow a_1 + 1, anan1a_n \leftarrow a_n - 1으로 변경했을 때 불편의 변화량은 2p2q1<02p - 2q - 1 < 0이 된다. 배열을 다시 정렬했을 때 ana12a_n - a_1 \ge 2인 한, 불편을 계속하여 감소시킬 수 있다. 따라서 ana12a_n - a_1 \ge 2가 되는 분배는 최적해가 아니다.

ana11a_n - a_1 \le 1라고 가정하면, 이를 만족하는 분배는 k,,k,k+1,,k+1k, \cdots, k, k + 1, \cdots, k + 1의 형태이다. kkk+1k + 1의 개수가 각각 l,ml, m일 때 원하는 답은 lml \cdot m이다. S=i=1naiS = \sum_{i = 1}^n a_i일 때, m=Smodnm = S \mod n, l=nml = n - m이다.

1543C Need for Pink Slips

기댓값의 의미를 잘 생각하고, 문제에서 주어진 설명을 잘 따라서 재귀 함수를 잘 구성하여 완전 탐색으로 풀 수 있다... 실수 오차나 스택 오버플로우 등을 상상하면 두려워지는데, Pink Slip를 뽑지 않을 때마다 Pink Slip을 뽑을 확률이 적어도 0.05 증가하므로 많아야 20단계 내에 끝나게 된다.

1543D RPD and Rap Sheet

비밀번호를 yy로 추측할 때마다, 틀린 추측이라면 원래 비밀번호 xxxkz=yx \oplus_k z = y를 만족하는 zz로 바뀐다. xxmmkk-itwise XOR한 것을 (m)x(\oplus m) \cdot x로 표기하자. 즉, (m)x=xkkx(\oplus m) \cdot x = x \oplus_k \cdots \oplus_k x인데 우변의 식에서 xxmm번 등장한다. (m)((n)x)=(mn)x(\oplus m) \cdot ((\oplus n) \cdot x) = (\oplus mn) x를 관찰하자.

양 변에 kx- \oplus_k xk1k - 1번 취하여 zk(xk(k1)x)=z=yk(k1)xz \oplus_k (x \oplus_k (\oplus k - 1) \cdot x) = z = y \oplus_k (\oplus k - 1) \cdot x 를 얻는다.

i=0i = 0번째 추측을 y=0y = 0으로 하자. i1i \ge 1에 대해, ii번째 추측을 ((k1)i)ik((k1)i1)(i1)(\oplus (k - 1)^i) i \oplus_k (\oplus (k - 1)^{i - 1}) \cdot (i - 1)으로 하자. 원래 비밀번호를 xx라고 하자. iZ1i \in \mathbb{Z}_{\ge 1}번째 추측에 비밀번호를 틀렸을 때, 바뀐 비밀번호가 ((k1)i)ik((k1)i+1)x(\oplus (k - 1)^i) \cdot i \oplus_k (\oplus (k - 1)^{i + 1}) \cdot x라고 가정하자. 만약 x=i+1x = i + 1이면, i+1i + 1번째 추측에서 비밀번호를 맞추게 된다. x>i+1x > i + 1이면 다음 비밀번호는 (((k1)i)ik((k1)i1)(i1))k(k1)(((k1)i)(i1)k((k1)i+1)x)\left( (\oplus (k - 1)^i) i \oplus_k (\oplus (k - 1)^{i - 1}) \cdot (i - 1) \right) \oplus_k (\oplus k - 1) \cdot \left( (\oplus (k - 1)^i) (i - 1) \oplus_k (\oplus(k - 1)^{i + 1}) \cdot x \right) 이고, 이를 정리하면 ((k1)i+1)(i+1)k((k1)i+2)x(\oplus (k - 1)^{i + 1}) \cdot (i + 1) \oplus_k (\oplus (k - 1)^{i + 2}) \cdot x이 된다. 원래 비밀번호는 [0,n)[0, n)에 있으므로, 귀납법을 통해 i=0,,n1i = 0, \cdots, n - 1에 대해 ii번째 추측을 시도하였을 때 이 중 한 번은 옳은 추측임을 알 수 있다.

임의의 mm에 대해 (k1)((k1)m)=((k1)2)m=m(\oplus k - 1) \cdot ((\oplus k - 1) \cdot m) = (\oplus (k-1)^2) m = m이므로, 이를 이용하여 ii번째 추측 ((k1)i)ik((k1)i1)(i1)(\oplus (k - 1)^i) i \oplus_k (\oplus (k - 1)^{i - 1}) \cdot (i - 1)를 계산해서 1을 입력받을 때까지 출력하면 된다.