thật ra ban đầu anh cũng mò thôi em ạ. đâu có nhớ công thức kia :V
bắt đầu với b0 nhân với n-1 các bj còn lại (j > 0)
tới b1 phải nhân với n-2 các bj còn lại (j > 1)
tới đây thì anh nhận thấy :V tích của bi với bk (k bất kì) = tích của bi và tổng S1 = b0 + b1 + … + bn-1. Vậy thay vì tính nhiều tích n-1, n-2, n-3, … ta chỉ cần tính 1 phép nhân cho mỗi tích là đủ: biS1. Nhưng bi nó ko bắt cặp với chính nó được nên ta cần trừ bi2 nữa. Và vì đề yêu cầu tích của bi và bj với i < j, tích biS1 - bi2 bao gồm cả i > j, nhưng may mắn là bibj = bjbi :V nên chỉ cần chia 2 thêm là xong.
vậy anh tìm ra được công thức tính nhanh là tổng (biS1 - bi2) rồi chia 2.
tới đây thì đã là O(n) rồi: tìm S1 là tổng mảng O(n), loop thêm 1 vòng for cho bi O(n) nữa là xong. Nhưng anh thấy ta còn có thể làm tốt hơn nữa :V Tổng biS1 vì nhân với S1 nhiều lần mà S1 là hằng số, ta có thể rút ra ngoài, công thức còn lại là S1(b0 + b1 + … + bn-1) = S12. Vậy nếu ta đặt S2 = b02 + b12 + … + bn-12 (tổng bình phương) thì ta có công thức cuối cùng là S = (S12 - S2) / 2
sau đó để cho chắc ăn là công thức đúng, anh gu gồ thì ra trang này :V :V https://www.geeksforgeeks.org/sum-product-pairs-array-elements/ nó giải thích bằng công thức toán kia :V :V :V nên anh thấy mình hơi ngu =]] nên chém gió bằng công thức toán này cho người ta tưởng mình giỏi toán =]]