CF1077A Frog Jumping 题解

Content

在一个数轴上有一个动点,初始时在 \(0\) 这个位置上,接下来有若干次操作,对于第 \(i\) 次操作:

  • 如果 \(i\) 是奇数,那么动点往右移 \(a\) 个单位。
  • 如果 \(i\) 是偶数,那么动点往左移 \(b\) 个单位。

现在有 \(t\) 次询问,每次给定 \(a,b,k\) 三个数(其中 \(a,b\) 含义如上所述),求经过 \(k\) 次操作后动点所在的位置。

数据范围:\(1\leqslant t\leqslant 10^3,1\leqslant a,b,k\leqslant 10^9\)

Solution

这道题目如果用暴力的话显然爆炸,所以我们来看有什么规律。自己画个数轴,跑几下之后就发现:如果操作的次数 \(k\) 是偶数,那么有 \(\dfrac{k}{2}\) 次交替向右移和向左移的操作,答案就是 \(\dfrac{k(a-b)}{2}\) 那么奇数次也就就很简单了,相当于在偶数次的基础上再往右移一次,那么答案就是 \(\left\lfloor\dfrac{k}{2}\right\rfloor(a-b)+a\)

注意如果直接相乘的话答案会很大,要开 \(\texttt{long long}\)。建议开变量的时候直接将 \(a,b,k\) 开成 \(\texttt{long long}\) 类型的,这样可以省去强制转化这个部分。

Code

int t;

int main() {
	getint(t);
	while(t--) {
		ll a, b, k, ans;
		getll(a), getll(b), getll(k);
		if(k % 2)	ans = a * (k / 2 + 1) - b * (k / 2);
		else	ans = a * k / 2 - b * k / 2;
		writell(ans);
		putchar('\n');
	}
	return 0;
}
posted @ 2021-12-21 19:47  Eason_AC  阅读(46)  评论(0)    收藏  举报