C++和式
一、基本概念
和式: ∑ \sum ∑
基本计算:
①
∑
1
5
=
1
+
2
+
3
+
4
+
5
=
15
\sum_{1}^{5}=1+2+3+4+5=15
∑15=1+2+3+4+5=15
②
在数组
i
=
[
1
,
3
,
6
,
7
,
3
,
8
,
3
,
4
,
9
,
5
]
i= [1,3,6,7,3,8,3,4,9,5]
i=[1,3,6,7,3,8,3,4,9,5]中,
∑
i
=
2
8
=
3
+
6
+
7
+
3
+
8
+
3
+
4
=
34
\sum_{i=2}^{8}=3+6+7+3+8+3+4=34
∑i=28=3+6+7+3+8+3+4=34
二、题目:
请你编写一个程序计算下面和式的结果,结果对1000000007取模。(1<=a[i],n<=100000)
【输入】
第一行一个整数n。
第二行n个整数,分别表示a[1]到a[n]。
【输出】
一个整数表示计算结果。
【输入样例1】
5
1 2 3 4 5
【输出样例1】
117
【输入样例2】
4
3 2 3 5
【输出样例2】
76
三、题解
令:
P
i
=
∑
j
=
1
i
a
j
P_i=\sum_{j=1}^{i}a_j
Pi=∑j=1iaj
S
j
=
∑
k
=
1
j
P
k
S_j=\sum_{k=1}^{j}P_k
Sj=∑k=1jPk
T
i
=
∑
j
=
1
i
j
×
a
j
T_i=\sum_{j=1}^{i}j\times a_j
Ti=∑j=1ij×aj
化简如下:
下面这个题解是一个稍微有“亿”点点问题的代码,可以对照第二个题解查看错误:D
//Code by BoXueDuoCai
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
int a[100005], p[100005], s[100005], t[100005], n;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) // 前缀和
{
cin >> a[i];
p[i] = p[i - 1] + a[i];
s[i] = s[i - 1] + p[i];
t[i] = t[i - 1] + i * a[i];
}
long long sum = 0;
for (int i = 1; i <= n; i++)
{ // 和式计算
sum = (sum + a[i] * ((n * (p[n] - p[i]) - (t[n] - t[i])) % MOD + ((n - i) * p[n] - (s[n] - s[i])) % MOD) % MOD) % MOD;
}
cout << sum;
return 0;
}
正确题解:
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
int n, a[100005];
long long p[100005], s[100005], t[100005];
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
p[i] = p[i - 1] + a[i];
s[i] = s[i - 1] + p[i];
t[i] = t[i - 1] + i * a[i];
}
long long sum = 0;
for (int i = 1; i <= n; i++)
{
sum = (sum + a[i] * ((n * (p[n] - p[i]) - (t[n] - t[i])) % MOD + ((n - i) * p[n] - (s[n] - s[i])) % MOD) % MOD) % MOD;
}
cout << sum;
return 0;
}