สมมติว่ามีอาร์เรย์ 'nums' ขนาด n ที่มีจำนวนเต็มบวก เรามี 'แบบสอบถาม' อาร์เรย์อื่นที่มีคู่จำนวนเต็ม (pi, qi) สำหรับทุกการสืบค้นในการสืบค้นอาร์เรย์ คำตอบจะเป็นผลรวมของตัวเลขในอาร์เรย์ nums[j] โดยที่ pi <=j
ดังนั้น หากอินพุตเป็น nums =[2, 3, 4, 5, 6, 7, 8, 9, 10], การสืบค้น =[(2, 5), (7, 3), (6, 4)] จากนั้นผลลัพธ์จะเป็น [13, 9, 8]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
A :=นับ
ถาม :=คำถาม
n :=ความยาวของ nums
ม :=10^9 + 7
m :=ค่าจำนวนเต็มของ (n ^ 0.5) + 2
P :=รายการใหม่ที่มีรายการ A m ครั้ง
สำหรับผมอยู่ในช่วง 1 ถึง m ทำ
สำหรับ j ในช่วง n-1 ถึง -1 ลดลง 1 ทำ
ถ้า i+j
P[i, j] :=(P[i, j]+P[i, i+j]) โมดูโล M
สำหรับแต่ละค่า b, k ใน Q ทำ
ถ้า k
ส่งกลับ [ค่าจากดัชนี P[k, b]]
อย่างอื่น
ส่งคืน [sum(A[b to k]) modulo M]
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
def solve(A, Q):
n, M = len(A), 10**9+7
m = int(n**0.5)+2
P = [A[:] for _ in range(m)]
for i in range(1,m):
for j in range(n-1,-1,-1):
if i+j < n:
P[i][j] = (P[i][j]+P[i][i+j]) % M
return [P[k][b] if k < m else sum(A[b::k]) % M for b, k in Q]
print(solve([2, 3, 4, 5, 6, 7, 8, 9, 10], [(2, 5), (7, 3), (6, 4)]))
อินพุต
[2, 3, 4, 5, 6, 7, 8, 9, 10], [(2, 5), (7, 3), (6, 4)]
ผลลัพธ์
[13, 9, 8]