첫번째 코드
구간 합 구하기를 세그먼트로 풀어보았다면 아래 코드 이해는 어렵지 않을 것이다.
하지만 곱하기를 이용하므로 MOD를 이용한다는 부분 정도를 생각한다면
금방 변형해서 풀 수 있는 문제이다.
import sys
input = sys.stdin.readline
n, m, k = map(int, input().split())
treeHeight = 0
length = n
MOD = 1000000007
while length != 0:
length //= 2
treeHeight += 1
treeSize = 2 ** (treeHeight + 1)
leftNodeStartIndex = treeSize//2 - 1
tree = [1] * (treeSize + 1)
for i in range(leftNodeStartIndex + 1, leftNodeStartIndex + n + 1):
tree[i] = int(input())
def setTree(i):
while i != 1:
tree[i // 2] = tree[i//2] * tree[i] % MOD
i -= 1
setTree(treeSize - 1)
def changeVal(index, value):
tree[index] = value
while index > 1:
index = index // 2
tree[index] = tree[index * 2] % MOD * tree[index * 2 + 1] % MOD
def getMul(s, e):
partMul = 1
while s <= e:
if s % 2 == 1:
partMul = partMul * tree[s] % MOD
s += 1
if e % 2 == 0:
partMul = partMul * tree[e] % MOD
e -= 1
s = s // 2
e = e // 2
return partMul
for _ in range(m + k):
question, s, e = map(int, input().split())
if question == 1:
changeVal(leftNodeStartIndex + s, e)
elif question == 2:
s = s + leftNodeStartIndex
e = e + leftNodeStartIndex
print(getMul(s, e))
통과
링크
programmers/백준/Gold/11505. 구간 곱 구하기 at main · ornni/programmers
repository for recording Programmers Algorithm problem solving - ornni/programmers
github.com
'코딩 테스트 > do it! 알고리즘 코딩테스트' 카테고리의 다른 글
076 이항 계수 1 (0) | 2024.08.08 |
---|---|
074 LCA (미해결) (0) | 2024.08.06 |
072 최솟값 (0) | 2024.08.01 |
071 구간 합 구하기 (0) | 2024.08.01 |
070 트리 순회 (0) | 2024.07.30 |