สมมติว่ามีอาร์เรย์ '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]