【ybtoj高效进阶6-1-1】序列的第k个数
题目大意:
给你一个等差数列或者等比数列,让你输出它们第k项的值取模后的结果。
思路:
首先判断等差数列和等比数列,具体方法就不讲了(见代码)。等差数列的第k项比较好求,求出公差后乘上
k
−
1
k-1
k−1 就行了。
等比数列也不难,求出公比后使用快速幂即可。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#define r register
#define rep(i,x,y) for(r ll i=x;i<=y;++i)
#define per(i,x,y) for(r ll i=x;i>=y;--i)
using namespace std;
typedef long long ll;
const ll p=200907;
ll t,a,b,c,k,res;
ll power(ll x,ll y,ll p)
{
ll ans=1;
while(y)
{
if(y&1) ans=(ans*x)%p;
x=x*x%p;
y>>=1;
}
return ans%p;
}
int main()
{
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld%lld%lld",&a,&b,&c,&k);
if(b-a==c-b)
{
ll d=(b-a)%p;
res=(a+(k-1)%p*d)%p;
}
else
{
ll q=(b/a)%p;
ll mod=power(q,k-1,p);
res=a%p*mod;
res%=p;
}
printf("%lld\n",res);
}
return 0;
}