数学:[ABC133D] Rain Flows into Dams 题解

在这里插入图片描述

思路简述

本题是一道数学题,重在推导

不妨定义数组 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×aibi+1
b n = 2 × a n − b 1 b_n=2 \times a_n-b_{1} bn=2×anb1

此时只需要求出 b b b 数组中的任意一项即可,此时我们不妨求出第 1 1 1 项:
b 1 = 2 × a 1 − b 2 b_1=2\times a_1-b_2 b1=2×a1b2
我们可以将 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×a12×a2+2×a32×anb1

化简一下:

b 1 = ∑ i = 1 n a i × ( − 1 ) i + 1 b_1=\sum_{i=1}^{n}a_i\times (-1)^{i+1} b1=i=1nai×(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值