快速指数(快速幂)/模指数运算代码模板

一/ 快速指数(快速幂)

求 x=base^a,base为底数,a为指数。

基本思想:对base^a分治:

base^a=\begin{cases} base^{\frac{a}{2}+\frac{a}{2}} =base^\frac{a}{2}*base^\frac{a}{2} ,& a\ mod\ 2 =0 \\ base^{\frac{a-1}{2}+\frac{a-1}{2}+1}=base^\frac{a-1}{2}*base^\frac{a-1}{2} *base,& a\ mod\ 2 =1 \end{cases}

可以把a分解成二进制数

代码基本框架

#include<iostream>
using namespace std;

typedef long long int LL;

LL poww(LL base, LL a);

int main()
{
	cout << poww(3, 20) << endl;
	return 0;
}

便于理解的函数定义

LL poww(LL base, LL a) {
	LL ans = 1;
	while (a != 0) {
		if (a & 1)	ans *= base;    // a&1 相当于a%2==1,加快运算
		base *= base;
		a >>= 1;    // 相当于a/=2,加快运算
	}
	return ans;
}

便于记忆的函数定义

LL poww(LL base, LL a) {
	LL ans = 1;
	for (; a; base *= base, a >>= 1)
		if (a & 1)	ans *= base;
	return ans;
}

二/ 模指数运算

代码基本框架

#include<iostream>
using namespace std;

typedef long long int LL;

//LL poww(LL base, LL a);
LL poww(LL base, LL a, LL md);

int main()
{
	//cout << poww(3, 20) << endl;
	cout << poww(7, 256,13) << endl;
	return 0;
}

其实和前面求快速幂大同小异。

便于理解的函数定义

LL poww(LL base, LL a,LL md) {
	LL ans = 1;
	while (a != 0) {
		if (a & 1)	ans =ans* base%md;
		base = base*base%md;
		a >>= 1;
	}
	return ans;
}

便于记忆的函数定义

LL poww(LL base, LL a, LL md) {
	LL ans = 1;
	for (; a; base = base * base % md, a >>= 1)
		if (a & 1)	ans = ans * base % md;
	return ans;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

iteapoy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值