输入b,p,k的值,求b^p mod k的值。其中b,p,k*k为长整型数。
直接暴力O(p),p为长整型可能会超时
可以采用分治的思想
当p为偶数时 b^p = b ^(p/2) * b^(p/2)
当p为奇数时 b^p = b^(p/2) * b^(p/2) * b //(b/2)向下取整
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll b,p,k,Pow;
ll Quick_Pow(ll b,ll p,ll k)
{
ll ret=1;
b%=k;
while(p)
{
if(p&1)ret=ret*b%k;
b=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;
}