序列的第 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;
}
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力

