输入a,b,c,求a^b mod c
直接快速幂会爆数据范围,配合慢速乘,乘转为加,超了就取模
#include <iostream>
using namespace std;
typedef long long ll;
ll slow_mul(ll a,ll b,ll c)
{
ll res=0;
while(b)
{
if(b&1)res=(res+a)%c;
a=(a+a)%c;
b>>=1;//等价于b/=2
}
return res%c;
}
ll quick_pow(ll a,ll b,ll c)
{
ll res=1;
while(b)
{
if(b&1)res=slow_mul(res,a,c);//无快速乘代码res=res*a%c
a=slow_mul(a,a,c);//同样a=a*a%c
b>>=1;
}
return res%c;
}
int main()
{
ll n,h,mol;
ll ans;
while(~scanf("%lld%lld%lld",&n,&h,&mol))
{
ans=quick_pow(n,h,mol);
printf("%lld\n",ans);
}
return 0;
}