a^b%c 小技巧

我们知道像a^b这样的数在计算的时候因为大的增长速度很快,所以经常越界,所以很多题目在出的时候都会让我们取模。

a^b = a*a*a*a……(一共b个a相乘);我们前一篇文章在说两个数相乘的时 ,如果两个数足够大的话,这两个数相乘就会越界,使计算结果出错。所以我们在来写a^b时应该先写出两个数相乘的计算方法。

这个就不多说了,上一篇文章中有在这只是贴出代码。

__int64 mult_mod(__int64 a,__int64 b,__int64 c)
{
	a=a%c;
	b=b%c;
	__int64 ans=0;
	while(b)
	{
		if(b&1) {   ans+=a; ans=ans%c;}
		a<<=1;a%=c;
		b>>1;
	}
	return ans;
}

现在我们再来说一下  a^b%c

我们在处理它时同样适用二进制和位运算来处理所以我说二进制和位运算是很重要的嘛。

__int64 pow_mod(__int64 a,__int64 b,__int64 c)
{
	a=a%c;
	__int64 ans=1;
	while(b)
	{
		if(b&1) 
		{   
			ans =mult_mod(ans,a,c);
			ans%=c;
		}
		a=mult_mod(a,a,c);
		b>>1;
	}
	return ans;
}

这和a*b%c有些类似,其实遇到这种位运算的都是这样来处理,我们学会了以后就能自己灵活的运用了。

好了。

感谢自己坚持。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值