博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模板—慢速乘
阅读量:5152 次
发布时间:2019-06-13

本文共 627 字,大约阅读时间需要 2 分钟。

用于模数很大直接乘会爆longlong的情况。

#include
#include
#include
#define LL long longusing namespace std;LL a,b,p;LL mull(LL a,LL b,LL p){ LL res=0; while(b) { if(b&1)res=(res+a)%p; a=(a+a)%p; b=b>>1; } return res;}signed main(){ cin>>a>>b>>p; LL ans=mull(a,b,p); cout<
<

好处是只要a,b在long long内,无论它们乘起来多大,都可以做。

劣势是时间复杂度是log(b)的,比起正常乘法来太慢了。

其实有O(1)的方法, 只适用于a*b没有超过long long太多的情况(即a,b并不算大,大概均在10^12左右)

设一个常数t。

令x1=a/t,x2=a%t

    y1=b/t,y2=b%t

显然a*b=(x1*t+x2)*(y1*t+y2)=x1*y1*t*t+x1*y2*t+x2*y1*t+x2*y2。但是感觉并不如慢速乘好用……

转载于:https://www.cnblogs.com/Al-Ca/p/11186793.html

你可能感兴趣的文章
程序代码记Log
查看>>
ORACLE 11G使用用EXPDP导出时,空表不能导出
查看>>
2017-2018-1 20155216 实验三:并发程序
查看>>
图像旋转
查看>>
九宫格抽奖
查看>>
阅读笔记第五章
查看>>
金蝶数据库执行语句
查看>>
前端SEO技巧
查看>>
python+selenium遇到鼠标悬停不成功可以使用js进行操作
查看>>
我的退休程序修正过程
查看>>
Java程序优化细节
查看>>
baihuilong advertising test
查看>>
Maven安装配置
查看>>
ORA-10635: Invalid segment or tablespace type
查看>>
计算机改名导致数据库链接的诡异问题
查看>>
Windows 8 操作系统 购买过程
查看>>
软件工程课程-个人编程作业
查看>>
Java8内存模型—永久代(PermGen)和元空间(Metaspace)(转)
查看>>
GitLab+Nginx(SSL)+MySQL+Ruby安装部署
查看>>
visualSVN server安装使用
查看>>