콘테스트 기록
A, C는 많이 어렵지 않게 풀었다. B 풀이가 상상이 안되어서, B에 많은 시간을 사용했다. D는 B를 푼 이후 문제를 읽고 문제 풀이 전략을 구상하였는데, 아이디어만 남긴 채 다 풀지는 못 하였다. E1, E2는 문제를 읽지 않았다. A는 00:02에, C는 00:39에, B는 01:21에 풀었다. D는 콘테스트 종료 후에 풀었다. E1, E2는 풀지 못했다.
1542A Odd Set
두 수의 합이 홀수가 되기 위해서는 홀수와 짝수가 짝지어져야 하므로 홀수와 짝수의 개수가 각각 n과 같은지 확인하면 된다.
1542B Plus and Multiply
문제에서 주어진 집합을 S라고 하자. S=Ta,b:={am+b⋅k:m,k∈Z≥0}이다. 다음을 관찰하자.
- 1=a0+b⋅0∈Ta,b이다.
- am+b⋅k∈Ta,b에 대해,
(am+b⋅k)⋅a=am+1+b⋅ak∈Ta,b,
am+b⋅k+b=am+b⋅(k+1)∈Ta,b
이다.
따라서 S⊂Ta,b이다. 한편 모든 am+b⋅k꼴의 수는 항상 1⋅a⋅⋯⋅a+b+⋯+b와 같이 표현되므로 S의 원소이고 Ta,b⊂S이다.
m을 늘려가며 n−am이 음이 아닌 b의 배수가 되는 m이 존재하는지 확인하여 n∈Ta,b=S인지 판정할 수 있다.
1542C Strange Function
m(k)을 1,2,⋯,k의 최소공배수라고 하자. f(x)=k은 x가 m(k−1)의 배수이면서 m(k)의 배수가 아닌 것과 동치이다. m(0)=1으로 정의하자. [n]에서 m(k)의 배수의 개수는 ⌊m(k)n⌋이므로, 구하려는 답은
∑k=1∞k⋅(⌊m(k−1)n⌋−⌊m(k)n⌋)=∑m(k)≤nk⋅(⌊m(k−1)n⌋−⌊m(k)n⌋)
이다. 이때 m(k)>n이면 ⌊m(k)n⌋=0이다. 이를 만족하는 가장 작은 k를 k0라고 하자. 식을 다시 써 보면
⌊m(0)n⌋+∑k=1k0((k+1)−k)⌊m(k)n⌋=n+∑k=1k0⌊m(k)n⌋
이고, 이는 쉽게 계산 가능하다.
1542D Priority Queue
각 + x
기호에 대해 이 x가 답에 어떻게 기여하는지 상상하는 것이 하나의 풀이 전략이 될 수 있다. 각 x에 대해, 배열 Qx를 할당한다. 이는 우선순위 큐 T에 현재 x보다 먼저 나가는 원소의 개수를, 그러한 상황을 만드는 A의 부분 문자열의 개수에 대응시킨다. 같은 값에 대해서는 나중에 들어온 것이 먼저 나간다고 가정할 수 있다. 주어진 명령들을 순서대로 순회하면서 + x
이전의 명령들과 + x
이후의 명령들에 대해 Qx에 적절한 연산들을 취하여 Qx가 그 목적에 맞도록 바꿀 수 있다. Qx에 남아있는 항을 모두 더하고 이를 x와 곱하여 답을 저장할 변수에 더한다. 이를 모든 + x
명령에 대해 반복하여 답을 얻을 수 있다. Qx의 크기를 n으로 잡으면, 이 방법의 시간 복잡도는 O(n3)이 된다. n≤500이므로 충분히 사용할 수 있는 풀이이다.