P8772 [蓝桥杯 2022 省 A] 求和

题目描述

给定 n 个整数 1,2,⋯ ,a1​,a2​,⋯,an​, 求它们两两相乘再相加的和,即

S=a1​⋅a2​+a1​⋅a3​+⋯+a1​⋅an​+a2​⋅a3​+⋯+an−2​⋅an−1​+an−2​⋅an​+an−1​⋅an​

输入格式

输入的第一行包含一个整数 n 。

第二行包含 n 个整数 1,2,⋯a1​,a2​,⋯an​ 。

输出格式

输出一个整数 S,表示所求的和。请使用合适的数据类型进行运算。

输入输出样例

输入 #1复制

4
1 3 6 9

输出 #1复制

117

思路:

题目思路结合了给我讲题的师兄

可以将a1​⋅a2​+a1​⋅a3​+⋯+a1​⋅an​+a2​⋅a3​+⋯+an−2​⋅an−1​+an−2​⋅an​+an−1​⋅an​,合并同类项,即

S=a1(a2+a3+...+an)+a2(a3+...+a5)+a3(a4+a5)+...

即S=ai(sn-si)i从1到n之和

代码:

n=int(input())
#将这些整数放在一个列表中
nums=list(map(int,input().split()))
#初始化前缀和列表
s=[0]*(n+1)
#计算前缀和
for i in range(n):
    s[i+1]=s[i]+nums[i]#计算前缀和,由于i从0开始故加一
#计算区域面积
ans=0
for i in range(n):
    ans+=nums[i]*(s[n]-s[i+1])#由于i从0开始前缀和i从1开始故加1
print(ans)

你可能感兴趣的:(蓝桥杯,算法,职场和发展)