快速幂、快速乘

快速幂等算法都是基于二进制优化的算法,本文不做过多叙述,在此只是留下模板,并介绍O(1)快速乘

快速幂

Copy
int qpow(int a, int b, int p) { int res = 1 % p; for (; b; b >>= 1, a = (long long) a * a % p) if (b & 1) res = (long long) res * a % p; return res; }

快速乘

Copy
#define qword long long qword qmul(qword a, qword b, qword p) { qword res = 0; for (; b; b >>= 1, a = (a + a) % p) if (b & 1) res = (res + a) % p; return res; }

O(1) 快速乘

利用 ab(modp)=ab[ab/p]p
首先 a,b<p 时, ab/p 一定小于 p ,我们可以用浮点数进行 ab/p 的运算,而不用关心小数点后面的部分。浮点类型long double在十进制下可以储存 18 19 位。
当浮点数的精度不足以保证位数时,它会以科学记数法舍弃低位,这并不会影响我们需要的整数部分的运算
另外,虽然 abab/p 可能很大,但是二者的差一定在 0 p1 之间,我们只关心它们的较低位数就可以,所以,我们用long long储存 ab[ab/p]p 各自的结果,整数溢出相当于舍弃最高位,也正好符合我们的要求

Copy
#define qword long long qword mul(qword a, qword b, qword p) { a %= p, b %= p; qword c = (long double) a * b / p; qword ans = a * b - c * p; if (ans < 0) ans += p; else if (ans >= p) ans -= p; return ans; }
posted @   AlessandroChen  阅读(468)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示