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

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

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

X 만들기

문제로 돌아가기

해설

f(x)f(x)f(x)를 000에서 시작하여 xxx를 만드는 최소 비용이라고 하자. XXX가 작다면 다음 점화식을 왼쪽부터 계산할 수 있다.

f(x)=min⁡(min⁡1≤i≤min⁡(K,x)(f(x−i)+Ai), [x가 짝수] (f(x/2)+B)).f(x)=\min\left(\min_{1\leq i\leq \min(K,x)}(f(x-i)+A_i),\ [x\text{가 짝수}]\,(f(x/2)+B)\right).f(x)=min(1≤i≤min(K,x)min​(f(x−i)+Ai

하지만 XXX가 매우 크므로 필요한 값의 범위를 줄여야 한다.

1. 마지막 두 배 연산 뒤의 덧셈

최적 연산열이 두 배 연산을 한 번 이상 사용한다고 하자. 마지막 두 배 연산 이후에 같은 종류의 연산 p+=ip\mathrel{+}=ip+=i가 두 번 등장할 수 없다.

실제로 마지막 두 배 연산 직전의 값이 yyy이고, 그 뒤에 +i+i+i가 두 번 등장한다면, 두 번의 +i+i+i를 지우고 마지막 두 배 연산 직전에 +i+i+i를 한 번 수행할 수 있다.

2(y+i)=2y+2i2(y+i)=2y+2i2(y+i)=2y+2i

결과는 같지만 비용은 2Ai2A_i2Ai​에서 AiA_iAi​로 감소하므로 기존 연산열은 최적일 수 없다.

따라서 마지막 두 배 연산 이후에 더해지는 값의 합은

S=1+2+⋯+K=K(K+1)2S=1+2+\cdots+K=\frac{K(K+1)}2S=1+2+⋯+K=2K(K

이하이다.

2. 덧셈 연산만 사용하는 비용

C(x)C(x)C(x)를 덧셈 연산만 사용하여 xxx를 만드는 최소 비용이라고 하자. 작은 xxx에 대해서는 완전 배낭 점화식으로 계산할 수 있다.

Aq/qA_q/qAq​/q가 최소가 되는 qqq를 하나 고른다. 나머지를 qqq로 본 그래프를 생각하고, +i+i+i에

qAi−iAqqA_i-iA_qqAi​−iAq​

의 가중치를 준다. qqq의 선택에 의해 모든 가중치는 음이 아니다. 같은 나머지를 두 번 방문하는 부분은 제거한 뒤 그 양만큼 +q+q+q로 채울 수 있으므로, 각 나머지에 대한 최적 경로는 q−1q-1q−1개 이하의 간선만 사용하도록 고를 수 있다. 이 경로가 더하는 값은 최대 K(q−1)K(q-1)K(q−1)이다.

따라서 0≤t≤K(q−1)0\leq t\leq K(q-1)0≤t≤K(q−1)에 대한 C(t)C(t)C(t)만 계산하면, 충분히 큰 xxx에 대해 r=라 할 때

C(x)=x−rqAq+min⁡0≤t≤K(q−1)tmodq=r(C(t)−t−rqAq)C(x)=\frac{x-r}{q}A_q+ \min_{\substack{0\leq t\leq K(q-1)\\t\bmod q=r}} \left(C(t)-\frac{t-r}{q}A_q\right)C(x)=q

로 C(x)C(x)C(x)를 O(1)O(1)O(1)에 구할 수 있다. 계산 중 매우 큰 덧셈 전용 비용은 충분히 큰 값으로 잘라 두어도 된다.

3. 필요한 구간만 재귀적으로 계산하기

구간 [L,R][L,R][L,R]의 모든 f(x)f(x)f(x)가 필요하다고 하자. x∈[L,R]x\in[L,R]x∈[L,R]의 최적 연산열이 두 배 연산을 사용한다면, 마지막 두 배 연산 직후의 값은 x−Sx-S 이상이다. 따라서 마지막 두 배 연산 직전의 값으로 필요한 범위는

[⌈max⁡(0,L−S)2⌉,⌊R2⌋]\left[\left\lceil\frac{\max(0,L-S)}2\right\rceil,\left\lfloor\frac R2\right\rfloor\right][⌈2max(0,L−S)​⌉,⌊

뿐이다.

이 절반 크기의 구간을 재귀적으로 계산한다. 그 뒤 J=[max⁡(0,L−S),R]J=[\max(0,L-S),R]J=[max(0,L−S),R]의 각 위치를 다음 값으로 초기화한다.

  • 덧셈만 사용하는 경우의 비용 C(x)C(x)C(x).
  • xxx가 짝수라면, f(x/2)+Bf(x/2)+Bf(x/2)+B.

이후 JJJ를 왼쪽부터 보면서 모든 1≤i≤K1\leq i\leq K1≤i≤K에 대해 xxx에서 x+ix+ix+i로 비용 의 전이를 한다. 모든 전이는 값이 증가하는 방향이므로 한 번의 순회로 최단 거리를 계산할 수 있다. 마지막에 에 해당하는 부분만 반환한다.

처음에는 구간 [X,X][X,X][X,X]만 요청한다. 재귀 단계에서 구간의 길이를 WWW라 하면 다음 단계의 길이는 대략 (W+S)/2(W+S)/2(W+S)/2이므로 항상 O(S)O(S)O(S이고, 재귀 깊이는 이다. 각 단계에서 길이 인 구간에 대해 개의 덧셈 전이를 확인하므로 전체 시간 복잡도는

O(KSlog⁡X)=O(K3log⁡X)O(KS\log X)=O(K^3\log X)O(KSlogX)=O(K3logX)

이고, 메모리 복잡도는 O(S+K2)O(S+K^2)O(S+K2)이다.

Solution written by GPT5.6

​
)
,
 
[
x
가 짝수
]
(
f
(
x
/2
)
+
B
)
)
.
+
1
)
​
x mod qr=x\bmod q
r=xmodq
x−r
​
Aq​
+
0≤t≤K(q−1)tmodq=r​min​(C(t)−qt−r​Aq​)
x−
S
2R​
⌋
]
AiA_i
Ai​
[L,R][L,R][L,R]
)
O(log⁡X)O(\log X)O(logX)
O(S)O(S)O(S)
KKK