problem
(已知给出一个长为n的序列 a,a中的每个数值为a_i,求所有任意两两匹配相乘的和(不与自己相乘))
solution
(1)简单的for循环思想来进行两两匹配) (O(n^2))
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
res += a[i]*a[j];
}
}
(2)通过前缀和来求解) (O(n))
例如:
(a[1]*a[2]+...+a[1]*a[n] = a[1]*(a[2]+..+a[n]);)
(a[2]*a[3]+...+a[2]*a[n] = a[2]*(a[3]+..+a[n]); //所以式子也就出来了)
(sum_{i=1}^n a[i]*(sum-a[i]); sum为sum_{i=1}^n a[i])
for(int i=1;i<n;i++){
res += a[i]*(sum-a[i]);
}