前缀和:在输入同时获得结果.
s[i]=s[i-1]+input(a[i]).
区间和:前缀做差
Sum[A,B]=s[B]-s[A-1].
for(i=1,i<=n,i++){
input(a[i]);
s[i]=s[i-1]+input(a[i]).
input(a,b);
count=s[b]-s[a-1];
}
分解伪代码
S=a2*a1+a3*(a2+a1)+a4*(a3+a2+a1)+a5*(a4+a3+a2+a1) 因式分解复杂度on;
>>> func_(){
input(n);
lld sum, j=0;
for(i=0-><n,1){%D
input(a[i]);
sum+=j*a[i];
j+=a[i];
}
return sum;
}
S=a1*(a2+a3+a4+a5)+a2*(a3+a4+a5)+a3*(a4+a5)+a4*a5 复杂度on;
前缀和:
lld a[], s[];
func_(){
int i , n;
lld sum=0;
input(a[i]);
for(i=0-><n,1){
if i=0 ->s[i]=a[i];
else s[i]=s[i-1]+a[i] //前缀和数组
}
for(i=0-><n,1){
sum+=a[i]*(s[n-1]-s[i]); //末项-初项
}
return sum;
}
acode
int main(){
int n;
scanf("%d",&n);
long long sum = 0, j=0;
for(int i=0;i<n;++i){
scanf("%d",&a[i]);
sum+=j*a[i];
j+=a[i];
}
printf("%lld",sum);
}