算法竞赛进阶指南 64位整数的乘法

这篇博客介绍了如何解决64位整数乘法的算法问题,特别是当计算涉及大整数乘法并需要取模操作时。通过将乘数转换为二进制形式,利用快速幂的思想逐位进行计算,避免了超出长整型范围的问题。这种方法的时间复杂度为O(log n)。文中以3乘以7为例,解释了这种简化计算的方法,并提到实际应用中可以避免直接计算导致的结果溢出。
摘要由CSDN通过智能技术生成
  1. 64位整数乘法
    题目
    求 a 乘 b 对 p 取模的值。

输入格式
第一行输入整数a,第二行输入整数b,第三行输入整数p。

输出格式
输出一个整数,表示a*b mod p的值。

数据范围
1≤a,b,p≤1018
输入样例:
3
4
5
输出样例:
2
思路分析:如果直接计算,结果就会超过long long的最大范围,我们一个可行的方法就是用类似于快速幂的思想将b表示成二进制数,如果b的当前位为1,就加上它的a的2的n次方,然后每次取模就可以了,可以看如下的例子
例:计算 3*7

7的二进制 111
3*(2^0)=3
3*(2^1)=6
3*(2^2)=12
我们知道37=21,而3+6+12也等于21,所以我们可以运用这个方法将计算简化,可以发现之后的每一次都是由前一次2得到,所以时间复杂度为log n,
下面看代码 `

#include<iostream>
using namespace std
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值