DOJ logoDOJ
문제
최근 추가된 문제들저장한 문제
카테고리DLC대회그룹팀게시판
랭킹
문제 풀이 랭킹스트릭 랭킹DOJ Power 랭킹
현황
문제 제안로그인회원가입
DOJ logoDOJ

OI 서브태스크 채점, Elo 레이팅, Discord 인증을 갖춘 커뮤니티 온라인 저지.

문제
문제 목록카테고리
커뮤니티
대회랭킹게시판공지사항외부 대회 개최이용 안내
계정
로그인회원가입채점 현황
정책
이용약관DLC 이용 규칙개인정보 처리방침API 사용 설명서언어별 채점 환경대회 순위 보상레이팅과 퍼포먼스
© 2026 DOJ
모든 권리 보유
해설

하나 둘 셋 2

문제로 돌아가기

해설

모든 값에서 111을 빼서 처음 값을 0,1,20,1,20,1,2로 바꾸어 생각하자. A<CA<CA<C라면 모든 값을 x↦2−xx\mapsto 2-xx↦2−x로 바꾸면 되므로, 이후에는 A≥CA\ge CA≥C라고 가정한다.

N=A+B+CN=A+B+CN=A+B+C, S=B+2CS=B+2CS=B+2C, g=gcd⁡(N,S, , 라고 하자. 최종 값은 반드시 전체 평균 이다. 연산을 몇 번 하더라도 모든 값은 기약분수로 나타냈을 때 분모가 의 거듭제곱수이므로, 가 의 거듭제곱수가 아니면 불가능하다.

ppp가 222의 거듭제곱수라고 하자. A≥CA\ge CA≥C이므로 q≤pq\le pq≤p이다. λ=max⁡(0,C−g⌊라고 두면 최소 연산 횟수는 이다.

Construction

p>1p>1p>1이면 qqq는 홀수이다. λ\lambdaλ개의 그룹을 만들고, 각 그룹의 크기를 2p2p2p, 0,1,20,1,20의 개수를 각각 로 둔다. 남은 원소는 개의 크기 인 그룹으로 나눈다.

Bound

한 번이라도 함께 연산한 두 인덱스 사이에 간선을 이어 그래프 GGG를 만들고, 연결 요소의 개수를 kkk라고 하자. 연결 요소의 크기가 sss라면 그 안의 최종 합 sq/psq/psq/p가 정수여야 하므로 sss는 pp의 배수이다. 각 연결 요소의 크기를 라고 하면 이다.

전체 시간 복잡도는 O(N)O(N)O(N)이다.

Solution written by GPT5.6

)g=\gcd(N,S)
g=gcd(N,S)
p=Ngp=\dfrac Ngp=gN​
q=Sgq=\dfrac Sgq=gS​
q/pq/pq/p
222
ppp
222
q2⌋)\lambda=\max\left(0,C-g\left\lfloor\dfrac q2\right\rfloor\right)
λ=max(0,C−g⌊2q​⌋)
N−g+λN-g+\lambdaN−g+λ
,
1
,
2
2p−q,0,q2p-q,0,q2p−q,0,q
g−2λg-2\lambdag−2λ
ppp

크기 ppp인 그룹에 222가 ccc개 들어간다면 0,1,20,1,20,1,2의 개수는 각각 p−q+cp-q+cp−q+c, q−2cq-2cq−2c, ccc여야 한다. 따라서 0≤c≤⌊q/2⌋0\le c\le\lfloor q/2\rfloor0≤c≤⌊q/2⌋이고, 모든 크기 ppp인 그룹에서 ccc의 합을 C−λqC-\lambda qC−λq로 맞추면 된다. λ\lambdaλ의 정의로부터 항상 가능하다.

각 그룹은 정확히 그룹 크기에서 111을 뺀 횟수만큼의 연산으로 평균화할 수 있다. 크기 ppp인 그룹은 0,1,20,1,20,1,2로 이루어지고 합이 홀수이다. 크기 2p2p2p인 그룹은 모든 값을 222로 나누면 합이 홀수인 0,10,10,1 그룹이 된다.

크기가 D=2kD=2^kD=2k이고 원소가 0,1,20,1,20,1,2이며 합이 홀수 qqq인 그룹을 생각하자. 연산을 거꾸로 구성한다. 처음에는 최종 평균 q/Dq/Dq/D가 DDD개 있다고 생각한다. 같은 값 xxx 두 개를 골라 하나를 원래 정수 a∈{0,1,2}a\in\{0,1,2\}a∈{0,1,2}로 확정하고, 다른 하나를 2x−a2x-a2x−a로 되돌리면 평균 연산 하나를 역으로 복원할 수 있다.

현재 활성 원소의 수가 DDD일 때 r=q mod Dr=q\bmod Dr=qmodD라고 하자. 모든 활성 값의 소수 부분은 r/Dr/Dr/D이므로 활성 값은 r/Dr/Dr/D와 1+r/D1+r/D1+r/D 두 종류뿐이다. 높은 값의 개수를 HHH라고 하고 같은 종류끼리 두 개씩 묶는다.

  • r<D/2r<D/2r<D/2이면 낮은 쌍은 000을 하나 확정하고 낮은 값 하나를 남긴다. 높은 쌍은 111을 확정해 높은 값을 남기거나, 222를 확정해 낮은 값을 남길 수 있다.
  • r>D/2r>D/2r>D/2이면 높은 쌍은 222를 하나 확정하고 높은 값 하나를 남긴다. 낮은 쌍은 111을 확정해 낮은 값을 남기거나, 000을 확정해 높은 값을 남길 수 있다.

다음 단계의 활성 원소는 D/2D/2D/2개이다. 각 상태 (D,H)(D,H)(D,H)에서 앞으로 복원할 수 있는 남은 222의 개수는 하나의 정수 구간을 이룬다. D=2D=2D=2에서는 (H,c)=(0,0)(H,c)=(0,0)(H,c)=(0,0) 또는 (2,1)(2,1)(2,1)이고, 위 전이로 작은 DDD부터 구간을 계산할 수 있다. 접두·접미 최솟값과 최댓값을 사용하면 한 레벨을 O(D)O(D)O(D)에 계산할 수 있고, 모든 레벨의 크기 합도 O(D)O(D)O(D)이다. 복원할 때는 다음 상태가 가능한 구간 안에 남는 전이를 하나 고른다. 기록한 역연산의 순서를 뒤집으면 D−1D-1D−1번의 정방향 연산을 얻는다.

p
ps1,ps2,…,pskps_1,ps_2,\ldots,ps_kps1​,ps2​,…,psk​
s1+s2+⋯+sk=gs_1+s_2+\cdots+s_k=gs1​+s2​+⋯+sk​=g

iii번째 연결 요소에 처음 222가 cic_ici​개 있었다면 그 연결 요소의 합은 qsiqs_iqsi​이므로 ci≤⌊qsi2⌋c_i\le\left\lfloor\dfrac{qs_i}{2}\right\rfloorci​≤⌊2qsi​이다. qqq가 홀수이므로 다음이 성립한다.

C≤∑i=1k⌊qsi2⌋=∑i=1k(si⌊q2⌋+⌊si2⌋)≤g⌊q2⌋+∑i=1k(si−1)=g⌊q2⌋+g−k.\begin{align*} C &\le \sum_{i=1}^k \left\lfloor \frac{qs_i}{2}\right\rfloor \\ &= \sum_{i=1}^k \left(s_i\left\lfloor\frac q2\right\rfloor+\left\lfloor\frac{s_i}{2}\right\rfloor\right) \\ &\le g\left\lfloor\frac q2\right\rfloor+\sum_{i=1}^k(s_i-1) \\ &= g\left\lfloor\frac q2\right\rfloor+g-k. \end{align*}C​≤i=1∑k​⌊

따라서 k≤g−λk\le g-\lambdak≤g−λ이다. 한 연결 요소를 만들려면 적어도 그 크기에서 111을 뺀 만큼의 연산이 필요하므로 전체 연산 수는 적어도

N−k≥N−g+λN-k\ge N-g+\lambdaN−k≥N−g+λ

이다.

​
⌋
2
qsi​
​
⌋
=i=1∑k​(si​⌊2q​⌋+⌊2si​​⌋)
≤g⌊2q​⌋+i=1∑k​(si​−1)
=g⌊2q​⌋+g−k.
​