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

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

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

전구의 쿼리 2

문제로 돌아가기

해설

전체 풀이

다음 누적곱과 누적합을 구한다. 모든 계산은 M=998 244 353M=998\,244\,353M=998244353으로 나눈 나머지에서 수행하며, 나눗셈은 모듈러 역원의 곱셈을 뜻한다.

C0=1,Ci=∏j=1iPjC_0=1,\qquad C_i=\prod_{j=1}^{i}P_jC0​=1,Ci​=j=1∏i​Pj​ Ri=∑j=1iCj−1−1,Ui=∑j=1iCjRj,Vi=∑j=1iCj,Wi=∑j=1iPj.R_i=\sum_{j=1}^{i}C_{j-1}^{-1},\qquad U_i=\sum_{j=1}^{i}C_jR_j,\qquad V_i=\sum_{j=1}^{i}C_j,\qquad W_i=\sum_{j=1}^{i}P_j.Ri​=

R0=U0=V0=W0=0R_0=U_0=V_0=W_0=0R0​=U0​=V0​이다. 쿼리 에 대해

H(l,r)=(Ur−Ul−1)−Rl−1(Vr−Vl−1)H(l,r)=(U_r-U_{l-1})-R_{l-1}(V_r-V_{l-1})H(l,r)=(Ur​−U

를 계산하면, 답은

2H(l,r)−(Wr−Wl−1)2H(l,r)-(W_r-W_{l-1})2H(l,r)−(Wr​−Wl

이다. 전처리 시간은 O(N)O(N)O(N)이고, 쿼리 하나를 O(1)O(1)O(1)에 처리한다. 따라서 전체 시간 복잡도는 O(N+Q)O(N+Q)O(N+Q)이다.

입력된 확률은 Pi=ai100P_i=\cfrac{a_i}{100}Pi​=100ai​​이며 는 이상 이하의 정수이다. 이 가지 확률과 그 역원을 미리 구해 두면, 와 를 각각 한 번의 곱셈으로 갱신할 수 있다. 에는 가 아니라 를 더한다. 확률이 이 아니므로 필요한 역원은 모두 존재한다.

증명

길이가 LLL인 덩어리 안에서 두 전구를 순서 있게 고르는 방법은 L2L^2L2가지이다. 같은 전구를 두 번 고르는 것도 허용한다. 따라서 길이 제곱 합은 같은 덩어리에 속한 전구 순서쌍의 수이다.

l≤a≤b≤rl\leq a\leq b\leq rl≤a≤b≤인 두 위치가 같은 덩어리에 속하려면 번부터 번까지의 전구가 모두 켜져야 하고, 이것으로 충분하다. 각 전구가 켜지는 사건은 독립이므로 그 확률은

서브태스크 1

모든 전구가 반드시 켜진다. 쿼리 구간에는 길이 r−l+1r-l+1r−l+1인 덩어리 하나가 있으므로 답은 (r−l+1)2(r-l+1)^2(r−l+1)2이다. 입력을 읽는 시간을 포함해 에 처리한다.

j=1∑i​
Cj−1−1​
,
Ui​
=
j=1∑i​Cj​Rj​,Vi​=
j=1∑i​Cj​,Wi​=
j=1∑i​Pj​.
=
W0​=
0
[l,r][l,r][l,r]
l−1
​
)
−
Rl−1​(Vr​−
Vl−1​)
−
1
​
)
aia_i
ai​
111
100100100
100100100
CiC_iCi​
Ci−1C_i^{-1}Ci−1​
RiR_iRi​
Ci−1C_i^{-1}Ci−1​
Ci−1−1C_{i-1}^{-1}Ci−1−1​
000
r
aaa
bbb
∏i=abPi=CbCa−1−1\prod_{i=a}^{b}P_i=C_bC_{a-1}^{-1}i=a∏b​Pi​=Cb​Ca−1−1​

이다. a=ba=ba=b인 경우에도 해당 전구가 켜져야 하므로 확률은 PaP_aPa​이다.

기댓값의 선형성에 의해, a<ba<ba<b인 쌍은 두 순서로 세고 a=ba=ba=b인 쌍은 한 번만 세면 된다. 따라서

H(l,r)=∑l≤a≤b≤rCbCa−1−1H(l,r)=\sum_{l\leq a\leq b\leq r}C_bC_{a-1}^{-1}H(l,r)=l≤a≤b≤r∑​Cb​Ca−1−1​

라고 하면 구하는 기댓값은 2H(l,r)−∑i=lrPi2H(l,r)-\sum_{i=l}^{r}P_i2H(l,r)−∑i=lr​Pi​이다.

이제 오른쪽 끝 bbb를 먼저 고정하여 합을 정리한다.

H(l,r)=∑b=lrCb∑a=lbCa−1−1=∑b=lrCb(Rb−Rl−1)=(Ur−Ul−1)−Rl−1(Vr−Vl−1).\begin{aligned} H(l,r) &=\sum_{b=l}^{r} C_b\sum_{a=l}^{b}C_{a-1}^{-1}\\ &=\sum_{b=l}^{r}C_b(R_b-R_{l-1})\\ &=(U_r-U_{l-1})-R_{l-1}(V_r-V_{l-1}). \end{aligned}H(l,r)​=b=l∑r​C

두 전구가 같은 덩어리에 속하는지는 그 사이의 전구만으로 결정된다. 쿼리 구간 밖의 전구가 켜졌는지에 대한 조건은 곱하지 않는다.

O(N+Q)O(N+Q)
O(N+Q)

서브태스크 2

각 쿼리 구간의 길이를 LLL이라 하자. 그 구간 안의 전구가 켜지거나 꺼지는 2L2^L2L가지 상태를 모두 살펴본다. 각 상태의 발생 확률과 길이 제곱 합을 구해 곱한 뒤 더한다. 쿼리당 O(L2L)O(L2^L)O(L2L), 테스트 케이스당 O(N+QN2N)O(N+QN2^N)O(N+QN2N)이다.

서브태스크 3

쿼리 구간을 왼쪽부터 순서대로 처리한다. 지금까지 처리한 구간의 오른쪽 끝에서 연속해서 켜진 전구 수의 기댓값을 sss, 길이 제곱 합의 기댓값을 eee라 하자. 처음에는 s=e=0s=e=0s=e=0이다.

새 전구가 켜지면 길이 LLL인 마지막 덩어리의 길이가 L+1L+1L+1이 되므로 길이 제곱 합은 2L+12L+12L+1만큼 늘어난다. 새 전구는 이전 전구들과 독립이므로

e←e+Pi(2s+1),s←Pi(s+1)e\leftarrow e+P_i(2s+1),\qquad s\leftarrow P_i(s+1)e←e+Pi​(2s+1),s←Pi​(s+1)

로 갱신한다. 첫 번째 식은 갱신하기 전의 sss를 사용한다. 쿼리 하나에 O(r−l+1)O(r-l+1)O(r−l+1)이 걸리며, 전체 시간 복잡도는 O(N+NQ)O(N+NQ)O(N+NQ)이다.

Solution written by GPT6

b​
a=l∑b​
Ca−1−1​
=b=l∑r​Cb​(Rb​−Rl−1​)
=(Ur​−Ul−1​)−Rl−1​(Vr​−Vl−1​).
​