题目大意
- 求 a^n 对 k 的取模;
题目分析
- 加法和乘法的取模,都是本身,所以可以边运算边取模,确保数据安全;
- 因为 n 会出现较大数据,O(n)的枚举是过不了的,只能想优化;
解题思路
- 观察以下样例:
样例1: 3 10 => ( 32 ) 5
样例2: 9 5 => 9 * ( 9 ) 4 - 分析:
样例1:如果幂是偶数,则将底数成方,幂可以直接减少一半;
样例2:如果幂是奇数,只是 多出来一个底数 ; - 结合以上的样例,快速幂的思维讲完了,具体看代码注解
上代码
//luogu1226:快速幂
//解题思路:
//倍增的思想
#include<bits/stdc++.h>
using namespace std;
long long a,n,k,s=1;
int main()
{
scanf("%lld %lld %lld",&a,&n,&k);
printf("%lld^%lld mod %lld=",a,n,k);
while(n>0)
{
if(n%2>0) s*=a; s%=k;//如果幂是奇数,答案乘一个底数
a*=a; a%=k;//如果幂是偶数,底数成方
n/=2;//幂减半
}
printf("%lld",s%k);//提防数据点是: 1 0 1
return 0;
}