序列的第 k 个数

// 序列的第 k 个数.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*

http://ybt.ssoier.cn:8088/problem_show.php?pid=1615
https://loj.ac/p/10193

BSNY 在学等差数列和等比数列,当已知前三项时,就可以知道是等差数列还是等比数列。
现在给你序列的前三项,这个序列要么是等差序列,要么是等比序列,
你能求出第 k 项的值吗。 如果第 k 项的值太大,对 200907 取模。

【输入】
第一行一个整数 T,表示有 T 组测试数据;

对于每组测试数据,输入前三项 a,b,c,然后输入 k。

【输出】
对于每组数据输出第 k 项的值,对 200907 取模。

【输入样例】
2
1 2 3 5
1 2 4 5
【输出样例】
5
16
【提示】
样例说明:

第一组是等差序列,第二组是等比数列。

数据范围与提示:

对于全部数据,1≤T≤100,1≤a≤b≤c≤109,1≤k≤109 。
*/


#include <iostream>

using  namespace std;

int a, b, c, k;
int T;


long long fastmi(long long a, long long b, long long mod) {
	long long res = 1;
	while (b) {
		if (b & 1) {
			res *= a;
			res %= mod;
		}
		a = a * a; a %= mod;
		b >>= 1;
	}

	return res;
}



void solve() {
	cin >> a >> b >> c >> k;
	if (a == b && b == c) {
		cout << a << endl;
		return ;
	}
	long long ans;
	if (c - b == b - a) {
		int diff = b - a;
		ans = a + 1ll*(k -1)* diff% 200907;
		ans %= 200907;
	}
	else {
		int diff = b / a;
		ans = 1ll * a * fastmi(diff,k-1, 200907);
		ans %= 200907;
	}

	cout << ans << endl;
	return;
}



int main()
{
	cin >> T;
	while (T--) {
		solve();
	}
	
	return 0;
}



posted on 2025-03-18 11:22  itdef  阅读(21)  评论(0)    收藏  举报

导航