Hướng dẫn cho Tổng Cặp Tích


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

Authors: shiba

Subtask 1:

Xét một dãy như sau: \(a_1, a_2, a_3, a_4\). Kết quả của ta sẽ có dạng:
\(a_1 × a_2 + a_1 × a_3 + a_1 × a_4 + a_2 × a_3 + a_2 × a_4 + a_3 × a_4\)
Viết lại ta được:
\(a_1 × (a_2 + a_3 + a_4) + a_2 × (a_3 + a_4) + a_3 × a_4\)
Tới đây chắc các bạn cũng đã nhận ra quy luật, gọi S là tổng của tất cả các phần tử trong mảng, ta viết lại biểu thức trên như sau:
\(a_1 × (𝑆 − a_1) + a_2 × (𝑆 − a_1 − a_2) + a_3 × (𝑆 − a_1 − a_2 − a_3) + a_4 × (𝑆 − a_1 − a_2 − a_3 − a_4)\)
Chúng ta có thể sử dụng kiến thức mảng cộng dồn để giải. Tính tổng tất cả các phần tử trong mảng, sau đó duyệt từ đầu đến cuối mảng, mỗi lần duyệt thì giảm \(S\) đi \(a_i\) đơn vị, rồi thêm \(a_i × 𝑆\) vào kết quả.

Subtask 2:

Vẫn với ý tưởng của subtask 1, nhưng vì số có thể lớn, nên ta sẽ sử dụng thêm cả kiến thức về modulo, cụ thể như sau:
\((a + 𝑏)\ \ mod \ 𝑚 = a\ \ mod \ 𝑚 + 𝑏\ \ mod \ 𝑚\)
Ta chỉ quan tâm tới kết quả mod \(10^9 + 7\) nên số không cần phải lớn, tức là ta chỉ cần nhân a_i với 9 chữ số đầu tiên của \(S\) cũng được, vì dù nhân với số lớn hơn thì \(9\) chữ số đầu tiên của \(a_i × 𝑆\) vẫn như thế.
Chúng ta sẽ tính tổng tất cả các phần tử trong mảng, và lấy mod \(10^9 + 7\) của nó, vậy còn khi thực hiện thao tác bớt đi \(a_i\) đơn vị thì sao?
Xét \((𝑆 − a_i)\) với \(S\)\(a_i\) là giá trị chưa mod, ta có:
\((𝑆 − a_i)\ \ mod \ 𝑚 = (𝑆 + (−a_i))\ \ mod \ 𝑚 = 𝑆\ \ mod \ 𝑚 + (−a_i)\ \ mod \ 𝑚\)
Vậy ta chỉ việc nhân \(a_i\) với \((𝑆 − a_i)\ \ mod \ (10^9 + 7)\) rồi tiếp tục mod thôi, lưu ý ở đây là việc xử lí \((−a_i)\ \ mod \ \ 𝑚\). Bởi trong C++ thì \((−3)\ \ mod \ \ 8 = −3\), tức là phép tính mod chỉ xét phần nguyên của số, bỏ qua dấu âm dương. Để tránh bị sai, ta chỉ việc cộng a_i với một lượng \(𝐾 × (10^9 + 7)\) nào đó để biểu thức dương rồi mới mod, bởi \((a_ + 𝑚)\ \ mod \ \ 𝑚 = a_\ \ mod \ 𝑚\). Ta biết \(a_i\) không vượt quá \(10^9 + 7\), do đó chỉ cần cộng biểu thức sau vào kết quả: \(a_i × (𝑆 − a_i + 𝑀)\ \ mod \ 𝑀\) với \(𝑀 = 10^9 + 7\).



Bình luận

Không có bình luận nào.