思路简述
本题是一道数学题,重在推导。
不妨定义数组 a a a 和 b b b ,分别代表输入数组和输出数组。
根据题意可以写出方程:
a i = b i 2 + b i + 1 2 a_i=\frac{b_i}{2}+\frac{b_{i + 1}}{2} ai=2bi+2bi+1
特别的,对于 i = n i=n i=n 存在特例:
a n = b n 2 + b 1 2 a_n=\frac{b_n}{2}+\frac{b_1}{2} an=2bn+2b1
将公式中的 1 2 \frac{1}{2} 21 系数消掉:
2
×
a
i
=
b
i
+
b
i
+
1
2 \times a_i=b_i+b_{i+1}
2×ai=bi+bi+1
2
×
a
n
=
b
n
+
b
1
2 \times a_n=b_n+b_1
2×an=bn+b1
将
b
i
b_i
bi 项移到等式左边,将
2
×
a
i
2 \times a_i
2×ai 项移到等式右边,并稍做变更:
b
i
=
2
×
a
i
−
b
i
+
1
b_i=2 \times a_i-b_{i+1}
bi=2×ai−bi+1
b
n
=
2
×
a
n
−
b
1
b_n=2 \times a_n-b_{1}
bn=2×an−b1
此时只需要求出
b
b
b 数组中的任意一项即可,此时我们不妨求出第
1
1
1 项:
b
1
=
2
×
a
1
−
b
2
b_1=2\times a_1-b_2
b1=2×a1−b2
我们可以将
b
2
b_2
b2 项代入进
b
1
b_1
b1 项中,
b
3
b_3
b3 项代入进
b
2
b_2
b2 项中……
最后直到带入到第 n n n 项:
b 1 = 2 × a 1 − 2 × a 2 + 2 × a 3 … 2 × a n − b 1 b_1=2 \times a_1-2\times a_2+2\times a_3…2\times a_n - b_1 b1=2×a1−2×a2+2×a3…2×an−b1
化简一下:
b 1 = ∑ i = 1 n a i × ( − 1 ) i + 1 b_1=\sum_{i=1}^{n}a_i\times (-1)^{i+1} b1=i=1∑nai×(−1)i+1
最后根据刚刚求出的公式,写出代码即可。
思路部分完结。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n;
ll a[100005];
ll b[100005];
int main() {
cin >> n;
for (ll i = 1; i <= n; i++) {
cin >> a[i];
}
for (ll i = 1; i <= n; i++) { //根据公式求出b[1]
b[1] += pow(-1, i + 1) * a[i]; //巧妙利用-1次方的特性
}
for (ll i = 2; i <= n; i++) {
b[i] = 2 * a[i - 1] - b[i - 1]; //利用公式转移
}
for (ll i = 1; i <= n; i++) {
cout << b[i] << " ";
}
return 0;
}