快速幂的实现

as we all know,
快速幂是一种实现a ^ k % p的算法
如果直接暴力搜的话,我们知道那是一中O(n)的实现
the core code is it

ll sum = 1;
for(int  = 0; i < k; i++)
{
	sum = sum * a % q;
}
cout << sum << endl;

但是的这种算法对于1e9的计算量实在实在是有些相形见绌了
所以就有了快速幂这样的一个算法
而这个算法的核心在于
如图
在这里插入图片描述
将问题转化为预处理这个区间内所有的值
这样就能将这个问题转化为logn的复杂度了
我们以4的3次方取模10为例子
在这里插入图片描述
这样代码的实现就很容易了

#include<iostream>
#include<algorithm>

using namespace std;

typedef long long ll;

int n;

int qml(int a, int b, int q)
{
	int res = 1;
	while(k){//只要这个k不为空 
	if(k & 1)res = (ll)res * a % p;//如果这个数的二进制位为1那么就是乘上去 
	k >>= 1;//右移一位 
	a = (ll)a * a % p;//预处理炒作,当然你也可以记录一个变量表现一个相差的次数,但是两个相隔太远会爆ll 
	}
	return ans;
}

int main(){
	scanf("%d", &n);//读入测试案例 
	while(n--)
	{
		int a, b, p;
		scanf("%d%d%d", &a, &b, &p);//读入a, k, p 
		cout << qml(a, b, p) << endl;
	}
	return 0;
} ```

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜狗原来是我自己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值