题目描述
求 a 的 b 次方对 p 取模的值。
输入格式
三个整数 a,b,p,在同一行用空格隔开。
输出格式
输出一个整数,表示的值。
数据范围
0≤a,b≤
1≤p≤
第一篇文章当然要好好纪念一下啦,又不是每篇都是第一篇~~~
快速幂板子题,直接套快速幂即可。
原理
快速幂基本思想就是将b用二进制进行表示,写为2的次方之和。那么可以写为------------------------。所以对于b的二进制如果第i位(从0开始算)是1,则b的用2的次方表示的表达式中肯定有,所以a的次方中也肯定有这一项,所以对b进行移位,判断最低位是否为1,如果是就乘进去,如果不是就继续移位。同时我们可以压缩指数,因为3^6=(3^2)^3=9^3,所以我们只需要每次将低数平方,指数减小一般即可。当然位运算速度快于算术运算,所以我们采用&运算符判断低位是否为1,>>进行除以2操作。
此外为了实现mod操作,需要我们掌握:
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void kuaisumi(ll a,ll b,ll p)
{
ll ans=1;
while(b)
{
if(b&1)
{
ans=((ans%p)*(a%p))%p;
}
a=((a%p)*(a%p)%p);
b>>=1;
}
cout<<ans%p<<endl;
}
int main()
{
ios::sync_with_stdio(false);
ll a,b,p;cin>>a>>b>>p;
kuaisumi(a,b,p);
system("pause");
return 0;
}