【牛客网】序列的第 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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值