输入b,p,k的值,求b^p mod k的值。其中b,p,k为长整型数。
还是在这个题干,只是做了小小的变动 k 的取值变了
当k>1e9 时,普通的快速幂直接乘爆
所以来一点小小的优化
将乘法转化一下
a*b=a+a+a+a+a+…+a;
当a为偶数 :a * (b/2)+a * (b/2)
当a为奇数 :a * (b/2)+a * (b/2)+a;
(像极了快速幂)
代码如下(Low_Times()):
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll b,p,k,Pow;
ll Low_Times(ll b,ll p,ll k)
{
ll ret=0;
while(p)
{
if(p&1)ret=(ret+b)%k;
b=(b<<1)%k;
p>>=1;
}
return ret%k;
}
ll Quick_Pow(ll b,ll p,ll k)
{
ll ret=1;
b%=k;
while(p)
{
if(p&1)ret=Low_Times(ret,b,k);
b=Low_Times(b,b,k);
p>>=1;
}
return ret%k;
}
int main()
{
cin>>b>>p>>k;
printf("%lld^%lld mod %lld=",b,p,k);
Pow=Quick_Pow(b,p,k);
cout<<Pow<<endl;
return 0;
}