最近学习数论,最先接触的就是快速幂了
这里我们跟这个题目一起巩固一下学习成果吧
求:a^b mod m (b<1e18)
我们先来看看代码:
#include<bits/stdc++.h>
using namespace std;
int quick_pow(int a,int b,int mod)
{
int ret = 1;//返回结果
while(b)
{
if(b&1)//将b转化成二进制和1进行与运算
ret = ret *a %mod;//若为真 乘a 取模
b>>=1;//b右移一位
a=a*a%mod;//a则乘上本身
}
return ret;
}
int main()
{
int n,m;
int mod;
cin>>n>>m>>mod;
cout<<quick_pow(n,m,mod);
return 0;
}
我们先来讲解一下代码:
我们举一个例子:
a^5
5(10) = 101(2)
a^5 = a^1 * a^4
对应于二进制的第一个1和第三个1
将b(101)和1与判断当前为二进制数是否为1,若为1则乘上对应的a的幂次a^1,若不为1则不进行任何操作,直接将b右移一位,舍掉最后一位的1,变成(10),此时还要将a平方对应下一个二进制数(a^2),0和1取与运算为否,直接进行移位和乘方,b变成(1),a变成a^4,和1取与后为真,乘上a^4,至此a^5计算结束。
接下来我们来看看mod是怎么回事。
mod:模运算,取余数 (%)
同余式:正整数a,b对p取模,它们的余数相同,记做 a ≡ b % p或者a ≡ b (mod p)。
模运算运算规则:
1.(a + b) % p = (a % p + b % p) % p
2.(a - b) % p = (a % p - b % p ) % p
3.(a * b) % p = (a % p * b % p) % p
4.(a^b) % p = ((a % p)^b) % p
根据题目,运用第4条运算规则进行取mod。