Применяя немного алгебры:
![algebra](https://i.stack.imgur.com/4uYag.png)
Итак, вот алгоритм, который вычисляет тот же результат за O (n) времени:
sum_A ← 0
for i ← 0 to n-1
sum_A ← sum_A + ArrayA[i]
sum_B ← 0
for j ← 0 to n-1
sum_B ← sum_B + ArrayB[j]
return sum_A * sum_B
Вообще говоря, алгоритм с вложенными циклами не всегда можно изменить, чтобы уменьшить временную сложность; но в некоторых случаях вы можете сделать это, если вы можете идентифицировать что-то определенное c относительно вычисления, что означает, что это может быть сделано другим способом.
Для таких сумм иногда возможно вычислить результат более эффективно, написав что-то алгебраически эквивалентное. Поэтому наденьте шапку своего математика, когда столкнетесь с такой проблемой.