

输入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;
}
这篇博客介绍了如何在数据范围过大导致快速幂运算溢出的情况下,结合慢速乘和快速幂算法,将乘法转换为加法并适时取模,以解决大整数模幂运算的问题。示例代码展示了如何实现这个算法,并在main函数中进行测试。
2913

被折叠的 条评论
为什么被折叠?



