2018蓝桥杯校选复现6

题目

汤达人有点fat,所以刚开始他只能跳1米远,但是它有个远大的理想:他想跳得更远。上天可怜他,派LJL送给他第m代绿巨人药剂,汤达人喝后,每一天跳远的长度都是前一天的m倍。那么请问n天后汤达人共跳了多远(答案需要模10007),如LJL送给他的是第3代药剂,即m = 3,那么第4天(n = 4)汤达人跳了(1 X 3 X 3 )% 10007 = 27(注意第一天只有1米)。

输入格式:

两个整数m, n (1 < m < 8,1 <= n <= 100000000)

输出格式:

一个整数(第n天汤达人总共跳了多远)

输入样例1:

3 4

输出样例1:

27

输入样例2:

2 6

输出样例2:

32

代码


#include <iostream>
using namespace std;
#define ll long long int
int main()
{
    ll m,n;
    cin>>m>>n;
    n=n-1;
    ll ans=1;
    ll base=m;
    if(n==1)
    {
        cout<<1<<endl;
        return 0;
    }
    while(n>0)
    {
        if(n%2==0)
        {
            n=n/2;
            base=base*base%10007;
        }
        else
        {
            n=n-1;
            ans=ans*base%10007;
            base=base*base%10007;
            n=n/2;
        }
    }
    cout<<ans<<endl;
    return 0;
}

分析

  1. 题目意思很简单,就是考察快速幂的算法。
  2. 就是求m的n-1次幂再取模10007,显然当n等于几千几万是没有一个数据类型可以容纳下,于是需要另辟蹊径。
  3. 首先要知道,对一个数取模,等于分别对其因子取模后相乘。
  4. 然后是要理解快速幂的思想:就是不断缩小指数,增大底数,以达到减小计算量的目的;参考超详细快速幂算法介绍
发布了21 篇原创文章 · 获赞 4 · 访问量 792

猜你喜欢

转载自blog.csdn.net/u011025050/article/details/103254318
今日推荐