序列的第k个数(快速幂)
Posted SSL_LKJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列的第k个数(快速幂)相关的知识,希望对你有一定的参考价值。
序列的第k个数
输入样例
2
1 2 3 5
1 2 4 5
输出样例
5
16
解题思路
判断等差数列是很简单的
- b-a==c-b
- 或者a+c==2*b
求等差数列也很简单
a n = a 1 + ( k − 1 ) ∗ ( a 2 − a 1 ) a_n=a_1+(k-1)*(a_2-a_1) an=a1+(k−1)∗(a2−a1)
那么问题就在求等比数列
a n = a 1 ∗ ( a 2 ÷ a 1 ) k − 1 a_n=a_1*(a_2 \\div a_1)^k-1 an=a1∗(a2÷a1)k−1
如果 k k k大一点,暴力肯定是会超时
所以我们用快速幂来优化
AC代码
#include<cstdio>
using namespace std;
int T;
const long long Mod=200907;
long long ksm(long long x,long long y)//快速幂
long long ans=1ll;
while(y)
if(y&1ll)ans=(ans*x)%Mod;
y>>=1ll;
x=x*x%Mod;
return ans;
int main()
scanf("%d",&T);
while(T--)
long long a,b,c,k;
scanf("%lld%lld%lld%lld",&a,&b,&c,&k);
if(a+c==b*2)printf("%lld\\n",1ll*a+1ll*(k-1)*(b-a)%Mod);//等差数列
else printf("%lld\\n",1ll*a*ksm(b/a,k-1)%Mod);//等比数列
return 0;
谢谢
以上是关于序列的第k个数(快速幂)的主要内容,如果未能解决你的问题,请参考以下文章