6593: A 的 B 次方(快速幂,龟速幂)
描述
给出三个整数 a,b,m,求 ab mod m 的值。
输入
一行三个整数 a,b,m。
对于全部数据,1≤a,b,m≤109 。
输出
一个整数,表示 ab mod m 的值。
样例输入
2 100 1007
样例输出
169
这道题是典型得到快速幂一类的题目
快速幂就是a的b次mod c这样形式的式子,但快速幂有个弊端,就是b的值不能太大超过1e9的范围就会爆掉,这是就需要用到龟速幂,用运行上的时间来换取数据范围的扩大,废话不多说上代码
1快速幂
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
long long a,b,m,num;
cin>>a>>b>>m;
num=1;
a=a%m;
while(b>0)
{ //这里用到了二进制
if(b&1==1) //表示为获取b二进制的最后一位判断是0还是1
{
num=num*a%m;
}
a=a*a%m;
b>>=1;
}
cout<<num<<'\n';
}
快速幂
如 :(3^5mod 6)
5的二进制为0101
为2^2 + 2^0==5
因此3^5就可以理解成 3^2 +3^0 == 3
2龟速幂
龟速幂就是为了防止快速幂爆掉在快速幂的基础上产生的
#include<iostream>
#include<cstdio>
using namespace std;
long long mul(long long a,long long b,long long m)
{
int num=0;
while(b!=0)
{
if(b&1)
{
num=(num+a)%m;
}
a=(a+a)%m;
b>>=1;
}
return num;
}
long long pow(long long a,long long b,long long m)
{
int sum=1;
while(b){
if(b&1)
{
sum=mul(sum,a,m);
sum%=m;
}
a=mul(a,a,m);
a%=m;
b>>=1;
}
return sum;
}
int main()
{
long long a,b,m;
cin>>a>>b>>m;
cout<<pow(a,b,m)<<'\n';
}
**龟速幂的原理也就是在快速幂的基础上去再取模,让快速幂中很大的数变小从而扩大数据范围