Codeforces Round 729

July 04, 2021

콘테스트 기록

A, C는 많이 어렵지 않게 풀었다. B 풀이가 상상이 안되어서, B에 많은 시간을 사용했다. D는 B를 푼 이후 문제를 읽고 문제 풀이 전략을 구상하였는데, 아이디어만 남긴 채 다 풀지는 못 하였다. E1, E2는 문제를 읽지 않았다. A는 00:02에, C는 00:39에, B는 01:21에 풀었다. D는 콘테스트 종료 후에 풀었다. E1, E2는 풀지 못했다.

1542A Odd Set

두 수의 합이 홀수가 되기 위해서는 홀수와 짝수가 짝지어져야 하므로 홀수와 짝수의 개수가 각각 nn과 같은지 확인하면 된다.

1542B Plus and Multiply

문제에서 주어진 집합을 SS라고 하자. S=Ta,b:={am+bk:m,kZ0}S = T_{a, b} := \{a^m + b \cdot k: m, k \in \mathbb{Z}_{\ge 0}\}이다. 다음을 관찰하자.

  1. 1=a0+b0Ta,b1 = a^0 + b \cdot 0 \in T_{a, b}이다.
  2. am+bkTa,ba^m + b \cdot k \in T_{a, b}에 대해,

(am+bk)a=am+1+bakTa,b,(a^m + b \cdot k) \cdot a = a^{m + 1} + b \cdot ak \in T_{a, b}, am+bk+b=am+b(k+1)Ta,ba^m + b \cdot k + b = a^m + b \cdot (k + 1) \in T_{a, b} 이다.

따라서 STa,bS \subset T_{a, b}이다. 한편 모든 am+bka^m + b \cdot k꼴의 수는 항상 1aa+b++b1 \cdot a \cdot \cdots \cdot a + b + \cdots + b와 같이 표현되므로 SS의 원소이고 Ta,bST_{a, b} \subset S이다.

mm을 늘려가며 namn - a^m이 음이 아닌 bb의 배수가 되는 mm이 존재하는지 확인하여 nTa,b=Sn \in T_{a, b} = S인지 판정할 수 있다.

1542C Strange Function

m(k)m(k)1,2,,k1, 2, \cdots, k의 최소공배수라고 하자. f(x)=kf(x) = kxxm(k1)m(k - 1)의 배수이면서 m(k)m(k)의 배수가 아닌 것과 동치이다. m(0)=1m(0) = 1으로 정의하자. [n][n]에서 m(k)m(k)의 배수의 개수는 nm(k)\left\lfloor \frac{n}{m(k)} \right\rfloor이므로, 구하려는 답은 k=1k(nm(k1)nm(k))=m(k)nk(nm(k1)nm(k))\sum_{k = 1}^\infty k \cdot \left( \left\lfloor \frac{n}{m(k - 1)} \right\rfloor - \left\lfloor \frac{n}{m(k)} \right\rfloor \right) = \sum_{m(k) \le n} k \cdot \left( \left\lfloor \frac{n}{m(k - 1)} \right\rfloor - \left\lfloor \frac{n}{m(k)} \right\rfloor \right) 이다. 이때 m(k)>nm(k) > n이면 nm(k)=0\left\lfloor \frac{n}{m(k)} \right\rfloor = 0이다. 이를 만족하는 가장 작은 kkk0k_0라고 하자. 식을 다시 써 보면 nm(0)+k=1k0((k+1)k)nm(k)=n+k=1k0nm(k) \left\lfloor \frac{n}{m(0)} \right\rfloor + \sum_{k = 1}^{k_0} ((k + 1) - k) \left\lfloor \frac{n}{m(k)} \right\rfloor = n + \sum_{k = 1}^{k_0} \left\lfloor \frac{n}{m(k)} \right\rfloor 이고, 이는 쉽게 계산 가능하다.

1542D Priority Queue

+ x 기호에 대해 이 xx가 답에 어떻게 기여하는지 상상하는 것이 하나의 풀이 전략이 될 수 있다. 각 xx에 대해, 배열 QxQ_x를 할당한다. 이는 우선순위 큐 TT에 현재 xx보다 먼저 나가는 원소의 개수를, 그러한 상황을 만드는 AA의 부분 문자열의 개수에 대응시킨다. 같은 값에 대해서는 나중에 들어온 것이 먼저 나간다고 가정할 수 있다. 주어진 명령들을 순서대로 순회하면서 + x 이전의 명령들과 + x 이후의 명령들에 대해 QxQ_x에 적절한 연산들을 취하여 QxQ_x가 그 목적에 맞도록 바꿀 수 있다. QxQ_x에 남아있는 항을 모두 더하고 이를 xx와 곱하여 답을 저장할 변수에 더한다. 이를 모든 + x 명령에 대해 반복하여 답을 얻을 수 있다. QxQ_x의 크기를 nn으로 잡으면, 이 방법의 시간 복잡도는 O(n3)\mathcal{O}(n^3)이 된다. n500n \le 500이므로 충분히 사용할 수 있는 풀이이다.