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]);
}
原文:https://www.cnblogs.com/Tianwell/p/12732824.html