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

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

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

과자파티

문제로 돌아가기

해설

각 과자를 먹을 확률과 누적합

iii번 과자를 먹을 지시변수를 XiX_iXi​, 그 과자를 먹을 확률을 eie_iei​라 하자. 기댓값의 선형성에 의해 구간 [l,r][l,r][l,r]의 답은

E[∑i=lrXi]=∑i=lrE[Xi]=∑i=lrei\mathbb{E}\left[\sum_{i=l}^{r}X_i\right]=\sum_{i=l}^{r}\mathbb{E}[X_i]=\sum_{i=l}^{r}e_iE[i=l∑r​X

이다. 서로 다른 과자를 먹는 사건들이 독립일 필요는 없다. 모든 질문은 같은 전체 과정을 기준으로 하므로, eie_iei​는 처음부터 한 번만 계산한다.

포만감의 분포 DP

dp[s]dp[s]dp[s]를 현재 과자를 살펴보기 직전 포만감이 sss일 확률로 정의한다. 처음에는 dp[0]=1dp[0]=1dp[0]=1이고 나머지는 000이다. ii번 과자에서 상태 일 때 먹을 확률은

qs=max⁡(0,pi−0.05s)q_s=\max(0,p_i-0.05s)qs​=max(0,pi​−0.05s)

이므로

ei=∑s=020dp[s]qse_i=\sum_{s=0}^{20}dp[s]q_sei​=s=0∑20​dp[s]

이다. 다음 분포 ndpndpndp를 모두 000으로 초기화하고

ndp[min⁡(20,s+1)]+=dp[s]qs,ndp[\min(20,s+1)]\mathrel{+}=dp[s]q_s,ndp[min(20,s+1)]+=dp[s]qs​, ndp[max⁡(0,s−1)]+=dp[s](1−qs)ndp[\max(0,s-1)]\mathrel{+}=dp[s](1-q_s)ndp[max(0,s−1)]+=dp[s](1−q

를 모든 sss에 대해 더한다. 이후 dpdpdp를 ndpndpndp로 교체한다. 같은 배열을 제자리에서 갱신하면 이번 과자의 결과를 다시 이번 과자의 입력으로 사용하는 오류가 생기므로 두 배열을 분리한다.

F0=0F_0=0F0​=0, Fi=Fi−1+eiF_i=F_{i-1}+e_iFi​=F를 저장하면 각 답은 이다. 구간 시작점에서 분포를 초기화해서는 안 된다. 또한 포만감의 평균만 저장하면 일반적으로 충분하지 않다. 먹을 확률의 하한 절단과 포만감 에서의 상태 변화 때문에 평균이 같아도 다음 먹을 확률이나 다음 평균이 달라질 수 있다.

정당성과 복잡도

현재 dpdpdp가 올바른 분포라고 하자. 주어진 조건부 확률을 곱한 두 전이는 먹는 경우와 먹지 않는 경우를 빠짐없이 나누며, 각각 정확한 다음 포만감으로 확률을 보낸다. 따라서 ndpndpndp도 올바른 분포이고 eie_iei​는 전확률 법칙으로 얻은 실제 먹을 확률이다. 초기 분포가 올바르므로 귀납적으로 모든 eie_ie가 맞다. 기댓값의 선형성과 누적합으로 모든 질문의 답도 맞다.

포만감 상태는 212121개이다. 시간은 O(21N+Q)O(21N+Q)O(21N+Q), 공간은 누적합을 포함해 O(N)O(N)O(N)이다. 질문을 읽는 즉시 출력하면 질문 배열은 저장할 필요가 없다.

작은 입력과 수치 처리

서브태스크 1에서는 N≤8N\leq8N≤8이다. 모든 먹기/건너뛰기 결과를 재귀로 열거하여 정확한 확률을 구할 수 있다. ci=100pic_i=100p_ici​=100pi​라 하면 각 단계의 먹기 분자는 , 건너뛰기 분자는 에서 이를 뺀 값이다. 모든 결과의 공통 분모는 이다. 결과별 분자 곱을 계산하고, 먹은 각 과자의 분자 합에 더한다. 시간은 , 공간은 이다.

N≤8N\leq8N≤8에서는 분모가 101610^{16}1016 이하, 기댓값 누적합의 분자는 8⋅10168\cdot10^{16}8⋅1016 이하이므로 signed 64-bit로 정확히 계산할 수 있다. 전체 제한에서는 거대한 정확한 분모를 만들지 않는다. 확률 DP와 누적합에 충분한 정밀도의 실수를 쓰면 된다. 제공한 정해는 입력 확률을 정수 로 읽고, 을 long double로 계산한다. 출력은 소수점 아래 자리이다. 기대 개수는 항상 이상 구간 길이 이하이다.

체커는 유한한 수만 허용하고 ∣a−b∣≤10−6max⁡(1,∣b∣)|a-b|\leq10^{-6}\max(1,|b|)∣a−b∣≤10−6max(1,∣b∣)를 검사한다. 여기서 aaa는 제출값, 는 기준값이다. 이는 절대 오차 또는 상대 오차 조건과 같다.

독립 검증

다른 구현은 상태별 확률 대신 누적분포 Cj=P(S≤j)C_j=P(S\leq j)Cj​=P(S≤j)를 갱신한다. j<20j<20j<20에 대해

Cj′=Cj−P(S=j)qj+P(S=j+1)(1−qj+1),C20′=1.C'_j=C_j-P(S=j)q_j+P(S=j+1)(1-q_{j+1}),\qquad C'_{20}=1.Cj′​=C

또한 q20=0q_{20}=0q20​=0이고, 포만감 000에서 먹지 않을 때만 보통의 −1-1−1 변화가 막힌다. 따라서

ei=E[S′]−E[S]+1−P(S=0)(1−pi)2.e_i=\frac{\mathbb{E}[S']-\mathbb{E}[S]+1-P(S=0)(1-p_i)}{2}.ei​=2E[S

평균은 E[S]=∑j=019(1−Cj)\mathbb{E}[S]=\sum_{j=0}^{19}(1-C_j)E[S]=∑j=019​(1−C로 구한다. 이 누적분포와 평균 변화식을 사용하는 구현으로 전체 데이터를 교차검증하고, 작은 입력은 정수 분자를 사용하는 전수검사와도 비교했다.

Solution written by GPT6

i
​
]
=
i=l∑r​E[Xi​]=
i=l∑r​ei​
i
sss
q
s​
s
​
)
i−1​
+
ei​
Fr−Fl−1F_r-F_{l-1}Fr​−Fl−1​
000
i
​
max⁡(0,ci−5s)\max(0,c_i-5s)
max(0,ci​−5s)
100100100
100N100^N100N
O(N2N+Q)O(N2^N+Q)O(N2N+Q)
O(N)O(N)O(N)
cic_ici​
max⁡(0,ci−5s)/100\max(0,c_i-5s)/100max(0,ci​−5s)/100
151515
000
bb
b
j
​
−
P(S=
j)qj​+
P(S=
j+
1)(1−
qj+1​),C20′​=
1.
′
]
−
E
[
S
]
+
1
−
P
(
S
=
0
)
(
1
−
pi​
)
​
.
j
​
)