【牛客网】序列的第 k 个数(快速幂)

题目描述

BSNY在学等差数列和等比数列,当已知前三项时,就可以知道是等差数列还是等比数列。现在给你序列的前三项,这个序列要么是等差序列,要么是等比序列,你能求出第k项的值吗。如果第k项的值太大,对200907取模。
输入描述:
第一行一个整数T,表示有T组测试数据;
对于每组测试数据,输入前三项a,b,c,然后输入k。
输出描述:
对于每组数据输出第k项的值,对200907取模。
示例1
输入
2
1 2 3 5
1 2 4 5
输出
5
16
说明
第一组是等差序列,第二组是等比数列。

备注:
对于全部数据,1≤T≤100,1≤a≤b≤c≤ 1 0 9 10^9 109,1≤k≤ 1 0 9 10^9 109

思路:

很基础的快速幂题目,不会快速幂的看一下这两篇
(1)快速幂详解
(2)牛客网 64位整数乘法

AC代码:

#include<iostream>
#include<cstdio>
    using namespace std;
    typedef long long LL;
    const int Mod=200907;
    bool IsDengBi(int a,int b,int c){
    
    
    if(a*c==b*b) return true;
    return false;
    }
    int DengBi(int a,int Bi,int k){
    
    
    LL base=Bi,ans=a;
    while(k){
    
    
    if(k&1) ans=(ans*base)%Mod;
    base=(base*base)%Mod;
    k=k>>1;
    }
    return ans;
    }
     int DengCha(int a,int cha,int k){
    
    
     LL base=cha,ans=a;
     while(k){
    
    
     if(k&1) ans=(ans+base)%Mod;
     base=(base+base)%Mod;
     k=k>>1;
     }
     return ans;
     }
    int main(){
    
    
    int T;
    scanf("%d",&T);
    int a,b,c,k;
    while(T--){
    
    
    scanf("%d%d%d%d",&a,&b,&c,&k);
    if(IsDengBi(a,b,c)) printf("%d\n",DengBi(b,c/b,k-2));
    else printf("%d\n",DengCha(a,b-a,k-1));
    }
    return 0;
    }

上一篇博客:【牛客网】树学(树形dp)

猜你喜欢

转载自blog.csdn.net/IAMLSL/article/details/114586125