DOJ logoDOJ
問題
最近追加された問題保存した問題Workbooks
カテゴリDLCコンテストグループチーム掲示板
ランキング
正解数ランキングストリークランキングDOJ Powerランキング
提出状況
問題募集ログイン新規登録
DOJ logoDOJ

OI形式のサブタスク採点、Eloレーティング、Discord認証を備えたオンラインジャッジです。

問題
問題一覧カテゴリ
コミュニティ
コンテストランキング掲示板お知らせ外部のコンテストを開催するガイド
アカウント
ログイン新規登録ジャッジ状態
ポリシー
利用規約DLCの利用規則プライバシーAPI 文書言語ランタイムコンテストの順位報酬レーティングとパフォーマンス
© 2026 DOJ
All rights reserved
解説

실크의 노래 (강철 영혼)

問題に戻る

解説

아래 풀이의 오류 등을 찾았을 경우 디스코드 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)