题意
给定一个式子
要求算出该式的和.
数据范围:
通过题目我们发现,这个式子直接暴力算肯定会爆时间
通过这个式子我们可以推导一下
我们将式子从左到右分成三个部分
- 对于第一个式子 =
- 对于第二个式子 = 对于后面这个类和式可以使用前缀和优化
- 对于第三个式子
以上的式子,请把每个式子展开,大家就会发现这个规律
结论
挂个链接 www.luogu.com.cn/problem/AT_…
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#define LL long long
#define PII std::pair<int , int>
const int N = 300010;
int n;
LL AI , AJ , AIJ;
LL A[N];
int main(){
std::cin >> n;
std::vector<int> v(n + 1);
for (int i = 1; i <= n; i ++ ) std::cin >> v[i];
for (int i = 2; i <= n; i ++ ) A[i] = A[i - 1] + v[i];
for (int i = 2; i <= n; i ++ ) AI += 1LL * (i - 1) * v[i] * v[i]; // ∑Ai^2
for (int i = 1; i < n; i ++ ) AJ += 1LL * (n - i) * v[i] * v[i];
for (int i = 1; i <= n; i ++ ) AIJ += 1LL * v[i] * (A[n] - A[i]);
LL ans = AI + AJ - 2 * AIJ;
std::cout << ans << '\n';
return 0;
}