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

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

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

실크의 노래 (강철 영혼)

문제로 돌아가기

해설

아래 풀이의 오류 등을 찾았을 경우 디스코드 0prime0으로 연락 주세요.


현재 체력을 hhh라고 하자. 최대한의 공격을 버틸 수 있는 전략은 다음과 같다.

  • 공격을 받는다. 즉, h←h−Ah \leftarrow h-Ah←h−A를 수행한다.
  • h≤Ah \leq Ah≤A이고 실크가 남아있다면 회복한다. 즉,
    1. h>Ah \gt Ah>A가 될 때까지 h←h+Bh \leftarrow h + Bh←h+B를 수행한다.
    2. h≥Hh \geq Hh≥H이면 h←Hh \leftarrow H를 수행한다.

H≤AH \leq AH≤A인 경우, 한 번의 공격에 즉사하므로 답은 항상 111이다.

H≥A+BH \geq A + BH≥A+B인 경우, 회복량을 항상 BBB가 되도록 할 수 있다. 따라서 답은 ⌈H+BSA⌉\left\lceil \frac{H+BS}{A} \right\rceil⌈A이다.

이제 A<H<A+BA \lt H \lt A+BA<H<A+B인 경우만 고려하면 된다.

회복 과정 (1)을 끝낸 후에는 항상 A<h≤A+BA \lt h \leq A+BA<h≤A+B가 된다는 것에 주목하자. y=A+B−hy=A+B-hy=A+B−h로 정의하면 초기값은 가 되고, 위 전략을 에 대한 식으로 쓰면 아래와 동치이다.

  1. y←(y+A)mod  By \leftarrow (y + A) \mod By←(y+A)modB
  2. y≤y0y \leq y_0y≤y이면

y←y0y \leftarrow y_0y←y0​이 수행되면 체력은 초기 상태인 최대 체력으로 돌아온다. 즉, y=y0y = y_0y=y0​에서 시작하여 처음으로 로 돌아올 때까지 값의 변화는 한 주기를 형성한다. 한 주기 동안 받은 공격의 수를 라고 하면, 는 를 만족하는 최소의 양의 정수가 된다. 먼저, 다음과 같은 표기법을 정의하자.

(L≤x≤R)mod  M⇔{xmod  M∈[Lmod  M,Rmod  M](Lmod  M≤Rmod  M)xmod  M∈[L

즉, xxx는 (−y0≤Ax≤0)mod  B\left( -y_0 \leq A x \leq 0 \right) \mod B(−y0​≤Ax≤0)mod를 만족하는 최소의 양의 정수이다. 로 쓰면, 는 를 만족하는 최소의 음이 아닌 정수이다. 이러한 문제는 에 풀 수 있음이 알려져 있으며, 예를 들어 와 같은 글에서 설명하고 있다.

f(A,M,L,R)f(A, M, L, R)f(A,M,L,R)을 (L≤Ax≤R)mod  M(L \leq A x \leq R) \mod M(L≤Ax≤R)을 만족하는 최소의 음이 아닌 정수 로 정의하자. 만약 이거나 이면, 이다.

만약 2(Amod  M)>M2(A \mod M) > M2(AmodM)>M인 경우, 부호를 뒤집어서 (−R≤−Ax≤−L)mod  M(-R \leq -A x \leq -L) \mod M(−R≤−을 풀자. 즉, 이다. 그러면 을 만족하게 된다. 따라서 이제부터 항상 을 가정할 수 있다.

먼저 자명한 해가 있는지 확인하자. (L′,R′)=(L,R)mod  M(L', R') = (L, R) \mod M(L′,R′)=(L,R)mod으로 두자. 만약 을 만족하는 음이 아닌 정수 가 있다면, 이 해가 된다.

그렇지 않다면, L′+Mt≤Ax≤R′+MtL' + Mt \leq A x \leq R' + MtL′+Mt≤Ax≤R′+Mt인 가 존재하는 최소의 음이 아닌 정수 를 찾아야 한다. 이는 과 동치이고, 이를 에서 보면 를 만족하는 해를 찾는 것이다. 이렇게 를 찾았으면, 는 를 만족하는 최소의 음이 아닌 정수이다. 즉, 이다. 이 관계식으로부터 를 계산할 때 항상 을 만족하므로, 값은 배 이상 감소한다. 따라서 의 계산에는 의 시간이 소요된다.

위 방법으로 한 주기 동안 받은 공격 횟수를 계산하면 x=1+f(A,B,−y0−A,−A)x = 1 + f(A, B, -y_0 - A, -A)x=1+f(A,B,−y0​−A,−A)이고, 그 동안의 회복 횟수 이다.

SSS를 NNN으로 나눈 몫을 qqq, 나머지를 rrr이라고 하자. 그러면 qqq주기를 반복하면서 qxqxqx번의 공격을 받고, 나머지 번의 회복은 모두 최댓값인 로 사용할 수 있다. 따라서 답은 이고, 시간 복잡도는 테스트 케이스당 이다.

h←H
H+BS
​
⌉
y0=A+B−Hy_0 = A+B-H
y0​=A+B−H
yyy
0​
y←y0y \leftarrow y_0y←y0​
y=y0y = y_0
y=y0​
yyy
xxx
xxx
(y0+Ax)mod  B≤y0(y_0 + A x) \mod B \leq y_0(y0​+Ax)modB≤y0​
mod  M,M)∪[0,Rmod  M](Lmod  M>Rmod  M)(L \leq x \leq R) \mod M \Leftrightarrow \begin{cases} x \mod M \in [L \mod M, R \mod M] & (L \mod M \leq R \mod M) \\ x \mod M \in [L \mod M, M) \cup [0, R \mod M] & (L \mod M \gt R \mod M) \\ \end{cases}
(L≤x≤R)modM⇔{xmodM∈[LmodM,RmodM]xmodM∈[LmodM,M)∪[0,RmodM]​(LmodM≤RmodM)(LmodM>RmodM)​
B
x=1+x′x = 1 + x'x=1+x′
x′x'x′
(−y0−A≤Ax≤−A)mod  B\left( -y_0 - A \leq A x \leq -A \right) \mod B(−y0​−A≤Ax≤−A)modB
O(log⁡B)\mathcal{O}(\log B)O(logB)
이 블로그
mod
M
xxx
(L>R)mod  M(L > R) \mod M(L>R)modM
Lmod  M=0L \mod M = 0LmodM=0
f(A,M,L,R)=0f(A, M, L, R) = 0f(A,M,L,R)=0
A
x
≤
−L)
modM
f(Amod  M,M,L,R)=f(−Amod  M,M,−R,−L)f(A \mod M,M,L,R) = f(-A \mod M,M,-R,-L)f(AmodM,M,L,R)=f(−AmodM,M,−R,−L)
2(−Amod  M)≤M2(-A \mod M) \leq M2(−AmodM)≤M
2A≤M2A \leq M2A≤M
M
L′≤Ax≤R′L' \leq A x \leq R'L′≤Ax≤R′
xxx
x=⌈L′A⌉x = \left\lceil \frac{L'}{A} \right\rceilx=⌈AL′​⌉
xxx
ttt
L′≤Ax−Mt≤R′L' \leq Ax - Mt \leq R'L′≤Ax−Mt≤R′
(modA)\pmod A(modA)
(L′≤−Mt≤R′)mod  A(L' \leq -Mt \leq R') \mod A(L′≤−Mt≤R′)modA
ttt
xxx
L′+Mt≤AxL' + Mt \leq AxL′+Mt≤Ax
f(A,M,L,R)=⌈L+Mf(−M,A,L′,R′)A⌉\displaystyle f(A,M,L,R) = \left\lceil \frac{L + M f(-M,A,L',R')}{A} \right\rceilf(A,M,L,R)=⌈AL+Mf(−M,A,L′,R′)​⌉
fff
2A≤M2A \leq M2A≤M
mod\text{mod}mod
222
f(A,M,L,R)f(A,M,L,R)f(A,M,L,R)
O(log⁡M)\mathcal{O}(\log M)O(logM)
N=⌈AxB⌉N = \left\lceil \frac{Ax}{B} \right\rceil
N=⌈BAx​⌉
rr
r
BBB
n=qx+⌈H+BrA⌉n = qx + \left\lceil \frac{H+Br}{A} \right\rceiln=qx+⌈AH+Br​⌉
O(log⁡B)\mathcal{O}(\log B)O(logB)