Forever Young

一本通 1615:【例 1】序列的第 k 个数

一本通 1615:【例 1】序列的第 k 个数

传送门

我在这里!


思路

输入一个序列的前三个数并求出这个序列的第K项,这个数列不是等比序列就是等差数列,等差数列比较好判断,如果序列中\(a_{i+2}-a_{i+1}=a_{i+1}-a_{i}\),那他肯定是等差数列,然后根据通项式\(a_{n}=a_{1}+{n-1}*d就可以求出第N项\)(\(d\)为一个常数,\(d=a_{i}-a_{i-1}\)).至于剩下的就一定是等比数列了,但求第N项的时候,\(a_{n}=a_{1}*q^{n-1}\),求q的n-1次方需要使用快速幂

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;

ll a,b,c,k,d,res;
ll t;
const ll M=200907;

ll quickpower(ll a,ll b) {
	ll ret=1;
	while(b) {
		if(b&1)ret=(ret*a)%M;
		b>>=1;
		a=a*a%M;
	}
	return ret;
}

int main() {
	scanf("%lld",&t);
	while(t--) {
		cin>>a>>b>>c>>k;
		if((c-b)==(b-a)) {
			d=(b-a)%M;
			res=(a+(k-1)%M*d)%M;
		} else {
			d=(b/a)%M;
			res=a%M*quickpower(d,k-1)%M;
		}
		cout<<res<<"\n";
	}
	return 0;
}
posted @ 2019-05-13 17:07  Loceaner  阅读(610)  评论(0编辑  收藏  举报