题目
汤达人有点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;
}
分析
- 题目意思很简单,就是考察快速幂的算法。
- 就是求m的n-1次幂再取模10007,显然当n等于几千几万是没有一个数据类型可以容纳下,于是需要另辟蹊径。
- 首先要知道,对一个数取模,等于分别对其因子取模后相乘。
- 然后是要理解快速幂的思想:就是不断缩小指数,增大底数,以达到减小计算量的目的;参考超详细快速幂算法介绍