【小技巧】O(1)快速乘
问题:求 \(a\times b\bmod p\),\(a,b,p\) 在 long long
范围内。
在 CRT 等算法中应用广泛。
为了处理模数在 int
范围外的情况,就是两数相乘可能会爆 long long
时,我们不能直接用整型的乘法来计算。
首先我们可以进行二进制拆分,化乘法为加法,类似快速幂那样,写出一个 \(O(\log n)\) 的快速乘
typedef long long s64;
inline void add(s64 &a, const s64 &b)
{
a += b;
if (a >= mod)
a -= mod;
}
inline s64 qmul(s64 a, s64 b, const s64 &mod)
{
a = (a % mod + mod) % mod;
b = (b % mod + mod) % mod; //这两行依据情况不写
s64 res = 0;
for (; b; b >>= 1, add(a, a, mod))
if (b & 1)
add(res, a, mod);
return res;
}
多次使用时,为了避免毒瘤出题人卡时间(或是为了优化常数),我们可以利用 long double
写出一个优秀的 \(O(1)\) 快速乘。
简单原理:\(a\times b\bmod p=a\times b-\lfloor \frac{a\times b}{p}\rfloor\times p\)
利用 long double
来处理这个 \(\lfloor \frac{a\times b}{p}\rfloor\)。
然后处理一下浮点误差就可以了。
模数较大时可能会出锅。
不过出锅概率很小
typedef long long s64;
typedef long double ld;
inline s64 qmul(s64 a, s64 b, s64 mod)
{
a = (a % mod + mod) % mod;
b = (b % mod + mod) % mod; //这两行依据情况不写
s64 res = a * b - (s64)((ld)a / mod * b + 1e-8) * mod;
return res < 0 ? res + mod : res;
}
【小技巧】O(1)快速乘的更多相关文章
- 小技巧-C#文本快速删除空行
查找:^\s*\n 替换空格 选择正则表达式
- 小技巧:如何快速开启一个静态 HTTP 服务?
静态 HTTP 服务的几个用途: 静态网页的 HTTP 服务,以访问浏览 如:生成的文档.博客等 公开文件的 HTTP 服务,以访问下载 如:分享的文档.安装包等 以下会介绍目前我了解的方式中,最推荐 ...
- 快速掌握iOS API的一个小技巧
快速掌握iOS API的一个小技巧 周银辉 iOS SDK和Developer Library中提供了各个类以及函数的帮助文档,这很棒,但要想了解整个库的大体结构(比如UIKit下有哪些类,他们的继承 ...
- HDU 5895 Mathematician QSC(矩阵乘法+循环节降幂+除法取模小技巧+快速幂)
传送门:HDU 5895 Mathematician QSC 这是一篇很好的题解,我想讲的他基本都讲了http://blog.csdn.net/queuelovestack/article/detai ...
- iOS:小技巧(不断更新)
记录下一些不常用技巧,以防忘记,复制用. 1.获取当前的View在Window的frame: UIWindow * window=[[[UIApplication sharedApplication] ...
- 最强 Android Studio 使用小技巧和快捷键
写在前面 本文翻译自 Android Studio Tips by Philippe Breault,一共收集了62个 Android Studio 使用小技巧和快捷键. 根据这些小技巧的使用场景,本 ...
- ios开发中的小技巧
在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...
- Jquery 小技巧
[每个程序员都会的35个jQuery的小技巧]收集的35个jQuery的小技巧/代码片段,可以帮你快速开发
- 玩转Windows服务系列——Windows服务小技巧
伴随着研究Windows服务,逐渐掌握了一些小技巧,现在与大家分享一下. 将Windows服务转变为控制台程序 由于默认的Windows服务程序,编译后为Win32的窗口程序.我们在程序启动或运行过程 ...
- 10个jQuery小技巧
收集的10个 jQuery 小技巧/代码片段,可以帮你快速开发. 1.返回顶部按钮 你可以利用 animate 和 scrollTop 来实现返回顶部的动画,而不需要使用其他插件. $('a.top' ...
随机推荐
- [转帖]龙芯3A/3B3000通用处理器出货超30万 获得“中国芯”大奖
龙芯3A/3B3000通用处理器出货超30万 获得“中国芯”大奖 http://www.eetop.cn/cpu_soc/6946247.html 2019.10 的新闻 出后量 30万 我们贡献了 ...
- Python字符串的截取原理,下标的位置图示
Python字符串截取时总是有些糊涂,从官网上找到一个图示,理解Python字符串是如何标记,的具体含义图示如下: +---+---+---+---+---+---+ | P | y | t | h ...
- Django模型层之单表操作
Django模型层之单表操作 一 .ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数据库管理软 ...
- Python 获取本月的最后一天
一.需求 现在有一个场景,需要每月的最后一天,发送一封邮件. 二.获取本月最后一天 有没有办法使用Python的标准库轻松确定(即一个函数调用)给定月份的最后一天? 答案是有的,使用 datetime ...
- Ubuntu 18.04下安装Steam顶级在线游戏平台
Ubuntu 18.04下安装Steam顶级在线游戏平台 原创: 聆听世界的鱼 Linux公社 今天 Steam是由Valve公司开发的顶级在线游戏平台,是目前全球最大的综合性数字发行平台之一.它让你 ...
- 作业调度框架Quartz.NET | 大专栏
原文:作业调度框架Quartz.NET | 大专栏 作业调度框架Quartz.NET 发表于 2019-09-28 | 分类于 前端 | 没有评论 前言 任务调度系统并不是完美的,它会出现任务执行 ...
- C#学习笔记------参数
一.形参 形参是本地变量,它声明在方法的参数列表中,而不是方法体中.
- canvas上画出坐标集合,并标记新坐标,背景支持放大缩小拖动功能
写在前面:项目需求,用户上传一个区位的平面图片,用户可以在图片上添加新的相机位置,并且展示之前已绑定的相机坐标位置,图片支持放大缩小&拖动的功能.新增坐标,页面展示相对canvas定位,保存时 ...
- 使用vue-cookies
1.在项目中安装vue-cookies: npm install vue-cookies --save 或 yarn add vue-cookies --save 2.全局引用: //在 main.j ...
- Part_six:Redis-cluster 实现集群
redis-cluster 1.并发问题 redis官方生成可以达到 10万/每秒,每秒执行10万条命令 假如业务需要每秒100万的命令执行呢? 2.客户端分片 redis3.0集群采用P2P模式,完 ...