一只蒟蒻的龟速乘学习笔记

更多请见DUMBLOG

一只蒟蒻的龟速乘学习笔记

背景

关于快速幂:
它死了。
咳咳。
以下是快速幂模板:

inline int q_p(int a, int k, int p) 
{
	int ans = 1;
	while (k) 
	{
		if (k & 1)ans = ans * a % p;
		k >>= 1;
		a = a * a % p;
	}
	return ans;
}

可以看出,快速幂有一个缺点:当模数 p 大于 int 范围(最大值为 231-1)时,快速幂会爆 long long。
此时解决 ab % c 的问题时就无法用快速幂了。
于是,龟速乘应运而生。

龟速乘

原理

通过将 乘法 转化为 加法每次取模 而避免了爆 long long。

代码

//龟速乘
inline int q_m(int a, int k, int p)
{
	int ans = 0;
	while (k)
	{//    区别在这里 ↓
		if(k & 1)ans += a, ans %= p;
		k >>= 1;
		a = a + a, a %= p;
		//和这里 ↑
	}
	return ans;
}
//快速幂
inline int q_p(int a, int k, int p) 
{
	int ans = 1;
	while (k) 
	{
		if (k & 1)ans = q_m(ans, a, p), ans %= p;
		k >>= 1;
		a = q_m(a, a, p), a %= p;
	}
	return ans;
}

速度

顾名思义,龟速乘会比系统的乘法慢一些。

OK就这样。
本蒟蒻新学 OI ,如有错误请 D 我。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值