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

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

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

Cats & Soup: Magic Recipe

문제로 돌아가기

해설

합칠 수 있으면 바로 합친다

레벨 xxx인 아이템의 무게를 2x−12^{x-1}2x−1이라 하자. 합치는 행동은 종류별 총무게를 유지하고, 차지하는 칸을 하나 줄인다. 같은 종류의 아이템을 더 이상 합칠 수 없을 때까지 합치면, 레벨 MMM 미만에서는 각 레벨의 아이템이 최대 하나만 남는다. 이 상태는 총무게의 이진 표현으로 유일하게 정해지며, 같은 총무게를 표현하는 상태 중 칸을 가장 적게 사용한다.

생성될 종류의 순서를 미리 고정해 보자. 어떤 전략이 그 순서대로 생성을 계속할 수 있다면, 매번 가능한 합성을 모두 하는 전략도 계속할 수 있다. 같은 총무게에서 빈 칸이 더 적어지지 않기 때문이다. 별의 총무게가 2L−12^{L-1}2L−1에 도달하면 합성을 통해 반드시 레벨 LLL의 별을 만들 수 있다. 따라서 모든 생성 결과의 순서에 대해 즉시 합성하는 전략이 다른 전략보다 불리하지 않다. 목표를 만들 때까지 가능한 합성을 모두 한 뒤, 빈 칸이 있으면 생성하면 된다.

상태

S=2L−1S=2^{L-1}S=2L−1, H=2M−1H=2^{M-1}H=2M−1이라 하자. 목표 별이 생기기 전에는 별의 정규화된 상태를 인 비트마스크로 나타낼 수 있다. 달은 레벨 미만의 비트마스크 와, 합칠 수 없는 레벨 달의 개수로 나타낸다.

레벨 MMM 달이 차지하는 칸을 뺀 나머지 칸 수를 ccc라 하자. F(c,s,t)F(c,s,t)F(c,s,t)를 이 상태에서 목표를 달성할 확률로 정의한다. 현재 남은 칸 중 사용한 칸 수는

popcount⁡(s)+popcount⁡(t)\operatorname{popcount}(s)+\operatorname{popcount}(t)popcount(s)+popcount(t)

이다. 이 값이 ccc 이상이면 더 생성할 수 없으므로 확률은 000이다. c=0c=0c=0인 상태도 000으로 둔다.

빈 칸이 있으면 별 생성 시 sss에 111을 더한다. 이는 합성으로 생기는 모든 이진 올림을 한꺼번에 처리한다. s+1=Ss+1=Ss+1=S이면 즉시 목표를 달성한다. 달 생성 시에도 ttt에 111을 더하되, 이면 레벨 달이 하나 생겨 , 이 된다.

α=a/b\alpha=a/bα=a/b, β=1−α\beta=1-\alphaβ=1−α라 하면 다음과 같다.

F(c,s,t)=αA+βB,F(c,s,t)=\alpha A+\beta B,F(c,s,t)=αA+βB, A={1s+1=S,F(c,s+1,t)s+1<S,A=\begin{cases}1 & s+1=S,\\F(c,s+1,t)&s+1<S,\end{cases}A={1F(c,s+1,t B={F(c−1,s,0)t+1=H,F(c,s,t+1)t+1<H.B=\begin{cases}F(c-1,s,0)&t+1=H,\\F(c,s,t+1)&t+1<H.\end{cases}B={F(c−1,s

답은 F(N,0,0)F(N,0,0)F(N,0,0)이다. 목표 별이 만들어지는 전이는 인벤토리가 가득 찼는지 검사하기 전에 성공으로 처리해야 한다. 레벨 MMM 달은 버릴 수 없으며, 반드시 ccc를 줄여야 한다.

ccc는 증가하는 순서로, 같은 ccc에서는 s,ts,ts,t를 감소하는 순서로 계산한다. 필요한 값은 같은 층과 바로 이전 층에만 있으므로 두 층만 저장한다. 시간 복잡도는 O(N2L+M−2)O(N2^{L+M-2})O(N2L+M, 공간 복잡도는 이다. 전체 제한에서 상태 계산은 최대 번이다.

부분 점수

서브태스크 1은 각 종류와 레벨의 실제 개수를 배열로 저장하는 메모이제이션 탐색으로 해결할 수 있다. 가능한 합성을 하나 수행하고 재귀 호출하거나, 합성할 수 없고 빈 칸이 있으면 두 생성 결과로 분기한다. 아이템 수가 NNN 이하인 개수 배열은 최대 (N+2M2M)\binom{N+2M}{2M}(2MN+2M​)개이며, 이 서브태스크에서는 최대 848484개다. 제공한 naive가 이 방법이다.

서브태스크 2는 L=1L=1L=1이다. 별이 한 번이라도 생성되면 성공하므로, 달만 계속 생성했을 때 인벤토리가 처음 막힐 때까지의 생성 횟수 DDD를 구하면 된다.

D={2N−1N<M,(N−M+2)2M−1−1N≥M.D=\begin{cases}2^N-1&N<M,\\(N-M+2)2^{M-1}-1&N\geq M.\end{cases}D={2N−

따라서 답은 1−βD1-\beta^D1−βD이다. 모듈러 거듭제곱을 사용하면 O(log⁡998 244 353+log⁡D)O(\log998\,244\,353+\log D)O(log998244353+logD) 시간에 계산할 수 있다.

모듈러 연산과 검증

P=998 244 353P=998\,244\,353P=998244353이라 하면 α=abP−2 mod P\alpha=a b^{P-2}\bmod Pα=abP−2mod로 계산하고 로 둔다. 한 번 생성할 때마다 총무게가 증가하며 총무게는 이하이므로 생성 횟수는 유한하다. 확률의 분모는 의 거듭제곱의 약수이고 이므로 역원이 존재한다.

두 확률 항의 곱을 더하는 중간값은 2(P−1)2<2⋅10182(P-1)^2<2\cdot10^{18}2(P−1)2<2⋅1018이므로 signed 64-bit 정수로 충분하다. 기약분수 자체를 큰 정수로 계산할 필요는 없다.

독립 검증용 forward 풀이는 별과 달의 총무게를 사용하여 확률 질량을 앞으로 전파한다. 작은 경우에는 생성과 모든 합성 선택을 전부 비교하는 유리수 최적 정책 탐색도 수행했다.

Solution written by GPT

0≤s<S0\leq s<S
0≤s<S
MMM
0≤t<H0\leq t<H0≤t<H
MMM
t+1=Ht+1=H
t+1=H
MMM
t=0t=0t=0
c←c−1c\leftarrow c-1c←c−1
)
​
s+1=S,s+1<S,​
,
0
)
F(c,s,t+1)
​
t+1=H,t+1<H.​
−
2
)
O(2L+M−2)O(2^{L+M-2})O(2L+M−2)
20⋅512⋅512=5 242 88020\cdot512\cdot512=5\,242\,88020⋅512⋅512=5242880
1
(N−M+2)2M−1−1
​
N<M,N≥M.​
P
β=(1−α+P) mod P\beta=(1-\alpha+P)\bmod Pβ=(1−α+P)modP
111
N2M−1N2^{M-1}N2M−1
bbb
1≤b<P1\leq b<P1≤b<P