OI中的一些数学小技巧
在OI比赛中,如果能够灵活地运用一些数学小技巧,是能够很好地优化计算的时间和正确性的。
既然说了是小技巧,那么这些指的都是一些技巧,一般是不会单独成题的。
本博客或会随着作者的见识而更新
Better的快速幂
有的时候,我们要去求解一个数或者一个矩阵的若干次幂,而这个指数在一般情况下是暴力无法接受的,这个时候我们会想到使用快速幂,即:
\(a^n=\begin{cases}\left(a^2\right)^{\dfrac{n}{2}}&2\mid n\\ a\left(a^2\right)^{\dfrac{n-1}{2}}&2\nmid n\end{cases}\)
这种做法可以做到优秀的 \(O(logn)\) 的复杂度。
但是,如果我们继续提高 \(n\) 的上限,long long存不下了呢?
栗子:Luogu P1397 [NOI2013] 矩阵游戏
这道题目有一个特别和善的数据范围: \(n \leqslant 10^{1000000}\)
似乎要写高精了,如果还是仿照快速幂的方式写,不难发现,由于高精度是按位处理,我们会发现,我们的复杂度会被卡到 \(O(log^2n)\) ,这个复杂度是我们无法接受的。
但我们想想,我们存的高精度是十进制的,如果我们用十进制来做快速幂,会怎么样?
我们考虑这样的形式:
\(a^n=\left(a^{10}\right)^{\left\lfloor\dfrac{n}{10}\right\rfloor}*a^{n \bmod 10}\)
我们只需要先预处理出 \(a^2\) 到 \(a^9\) 即可。
这样,我们规避了高精度除单精的问题,可以将时间优化到 \(O(logn)\) 了。
不难发现,我们平时写的快速幂就是光速幂的一种特殊形式,也就是对于二进制的处理方法
那么,是不是对于任意k进制,都可以用光速幂呢?
其实在形式上都是一样的,就是把上面的 \(10\) 换成 \(k\) 就可以了。
闲话(不知道正不正确,欢迎大佬指正):那么对于不同的 \(n\) ,最优的 \(k\) 会是多少呢?
由于我们需要进行预处理,首先会有一个 \(k\) 的运算,如果不考虑做除法的时间,后面的运算是 \(log_kn\) 的复杂度
那么它的总复杂度是 \(k+log_kn\) ,这个函数是先减后增的。
我们来找它的极小点,对 \(k\) 求导
\((k+\log_kn)'=(k)'+(\log_kn)'=1+\left(\dfrac{1}{\log_nk}\right)'\)
\(\left(\dfrac{1}{\log_nk}\right)'=-\dfrac{1}{\log_n^2k}*(\log_nk)'=-\dfrac{1}{\log_n^2k}*\log_ne(\ln k)'=-\dfrac{\log_ne}{k\log_n^2k}\)
\((k+\log_kn)'=1-\dfrac{\log_ne}{k\log_n^2k}\)
当导数取 \(0\) 时:\(0=1-\dfrac{\log_ne}{k\log_n^2k}\)
则 \(\dfrac{\log_ne}{k\log_n^2k}=1\)
所以 \(\log_ne=\log_n^2k\)
所以 \(e=k^{\log_nk}\)
\(e^{\ln n}=k^{\ln n\log_nk}\)
\(n=k^{\ln k}\)
对于上面的题目,大概 \(k\) 是在 \(10^5\) 左右
但是这个对于题目的优化似乎只是常数级别的,但一般要光速幂了就不会卡光速幂的常数,除非写的常数很大。
龟速乘
有的题目卡你幂的时间,有的题目却想卡你乘的上界:
Luogu P4774 [NOI2018] 屠龙勇士,P2044 [NOI2012] 随机数生成器
这个题目中虽然都要取模,但是它们的上界的平方会超过long long的上界,如果不用__int128或者高精,也不想写质数判断,我们能不能在舍弃时间的情况下,做到取模乘法呢?
这是可以的。
一般的题目不会卡死long long上界,也就是说,我们是可以对数据乘一个常数的,而且最保险的是 \(2\)
这样就可以得到这样的式子 \(a*b=(a*2)*(b/2)\)
如果我们的 \(b\) 是奇数,就可以给统计答案的数加一个 \(a\) 即可。
这样,我们能够用 \(O(\log n)\) 的复杂度来做到不会溢出的乘法了!
光速乘
虽然但是,其实有比龟速乘更快的方法——\(O(1)\)光速乘。
主要是利用了long double强转成long long时对小数部分的舍弃来完成取模的,代码实现如下
long long mul(long long a,long long b,long long Mod)
{
return (a*b-(long long)((long double)(a)/Mod*b)*Mod+Mod)%Mod;
}
据说是有概率出错的,但是用了的都说好。
OI中的一些数学小技巧的更多相关文章
- [转]Golang 中使用 JSON 的小技巧
taowen是json-iterator的作者. 序列化和反序列化需要处理JSON和struct的关系,其中会用到一些技巧. 原文 Golang 中使用 JSON 的小技巧是他的经验之谈,介绍了一些s ...
- IDEA Intellij中vim插件使用小技巧
在 IDEA Intellij小技巧和插件 一文中简单介绍了一下IdeaVim插件.在这里详细总结一下这个插件在日常编程中的一些常用小技巧.供有兴趣使用这个插件,但对Vim还不十分熟悉的朋友参考.当然 ...
- EF Core 1.0中使用Include的小技巧
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:由于EF Core暂时不支持Lazy Loading,所以利用Include来加载额外 ...
- .NET中Main函数使用小技巧
摘要:任何语言开发出来的程序,都会有一个程序入口函数,可能每个语言所使用的程序入口函数名称不一样,但是它们的作用都是一样的,都是被操作系统去调用.那么本文主要总结.NET中的程序入口函数Main使用的 ...
- iOS 开发中使用到的小技巧汇总
国庆即将来到,一个小项目也即将完成,把自己在项目中用的一些小技巧写出来,方便查找. 1,去掉分割线--动画设置透明度alpha //去掉tableView的分隔线: self.tableVie ...
- [转]CMD命令提示符窗口中的快捷键、小技巧和常用命令
转至:https://wenku.baidu.com/view/d5d2b7ca360cba1aa811dac6.html 快捷键: F1:按F1一次,命令提示符向后切换到已经执行过的命令字符.如果 ...
- Fiddler使用过程中容易忽略的小技巧
fiddler的基本使用,在之前的一篇博文中有详细介绍,可参见Fiddler抓包工具使用详解,今天来分享几个容易忽略的小技巧. 1.ios机装了证书,依然抓不到包 近期总被同事问及ios机装了证书,但 ...
- OI常用的常数优化小技巧
注意:本文所介绍的优化并不是算法上的优化,那个就非常复杂了,不同题目有不同的优化.笔者要说的只是一些实用的常数优化小技巧,很简单,虽然效果可能不那么明显,但在对时间复杂度要求十分苛刻的时候,这些小的优 ...
- java语言中一些使用的小技巧(区别于c++)
正在自学java中...想记录下java和c++在一些小的方面的不同点.(未完待续...) java中class的对象均是引用类型的,如果想把连个同类型的对象相关联起来,只要将一个赋值给另一个就可以了 ...
- Photoshop中比较实用的小技巧
Photoshop是目前最流行的图片处理软件软件之一.能够说,只要接触图片处理,就要和它打交道.Photoshop的强大功能和众多的优点不用多说.用photoshop做一些漂亮的图片,或对照片进行简单 ...
随机推荐
- MINGW64 禁用 Bash 路径参数转换
MINGW64 可以让 Windows 无缝使用 Linux 命令,但是路径参数会被转换为 Windows 风格.例如: $ ./adb shell ls /system ls: C:/Program ...
- 基于Tensorflow技术开发的计算机毕业设计辅助生成器(使用AI大模型技术)
这是一个辅助生成计算机毕业设计的工具,可以自动完成毕业设计的源码.它基于几百个github上面开源的java和python项目,运用tensorflow技术,训练出了AI大模型.基本实现了计算机毕业设 ...
- C:\Keil_v5\ARM\ARMCC\include\stdint.h contains an incorrect path.
1.问题 在使用Keil uvison5打开例程代码进行学习时,发现部分.h文件无法读取 2.解决方法 1.找到如图的设置按钮(小锤子) 2.根据自己所用的是C/C++还是ARM选择(我这里是C/C+ ...
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2024.01.13)
一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...
- SQLServer性能优化之二
SQLServer性能优化之二 背景 优化了机器的硬件配置之后性能好了很多 但是偶尔还是会出现阻塞. SQL总是奇奇怪怪的. 其实第一天时就感觉可能是索引存在问题. 但是dbcc 重建所有数据库的索引 ...
- [转帖]一个小操作,SQL 查询速度翻了 1000 倍
https://tidb.net/book/tidb-monthly/2022/2022-04/usercase/sql-1000 背景介绍 某一天早上来到公司,接到业务同学反馈,线上某个SQL之前 ...
- [转帖]2.2.1 Lightning 工作原理
https://book.tidb.io/session2/chapter2/lightning-internal.html TiDB Lightning 工具支持高速导入 Mydumper 和 CS ...
- [转帖]AMD Zen CPU 架构以及不同CPU性能大PK
https://plantegg.github.io/2021/08/13/AMD_Zen_CPU%E6%9E%B6%E6%9E%84/ 前言 本文先介绍AMD Zen 架构,结合前一篇文章<C ...
- megacli_sw服务器Raid卡的设置过程
megacli_sw服务器的设置过程 背景 采购的申威服务器有四块硬盘, 第一台服务器在sdd上面安装了一个银河麒麟v10的系统 sda,sdb,sdc 三块硬盘没有进行raid设置, 直接还是用的J ...
- [转帖]springboot中使用skywalking实现日志追踪
文章目录 SkyWalking分布式追踪系统 介绍 主要架构 环境 引入依赖 配置Log4j2 下载编译好的8.7.0版本包 使用探针实现日志追踪 启动脚本 启动Java服务 访问服务 使用UI 切换 ...