博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[学习笔记]快速幂&&快速乘
阅读量:5891 次
发布时间:2019-06-19

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

本质:二进制拆分(你说倍增我也没脾气)。然后是一个配凑。

合起来就是边二进制拆分,边配凑。

 

快速乘(其实龟速):把乘数二进制拆分。利用乘法分配率。

用途:防止爆long long

代码:

ll qk(ll x,ll y,ll mod){    ll ret=0;    while(y){        if(y&1) (ret+=x)%=mod;        (x+=x)%=mod;        y>>=1;    }    return ret;}

 

如果为了卡常,可以写成这样:

ll qk(ll x,ll y,ll mod){    ll ret=0;    x%=mod;y%=mod;    while(y){        if(y&1) ret=ret+x>=mod?ret+x-mod:ret+x;        x=x+x>=mod?x+x-mod:x+x;        y>>=1;    }    return ret;}

第一行必须有x%=mod,y%=mod,否则开始x,y可能很大,减一次mod不能减到mod以下。

还是错过几次。。。

(有时候卡这个取模还是挺有效的。)

 

快速幂(真的快速):把指数二进制拆分。利用:a^(x+y)=a^x*a^y

用途:各种指数运算,一般还取模。

推广:矩阵快速幂。

 

代码略。

 

快速幂经常与快速乘结合。log^2n也是可以接受的。

例题:

直接推式子,然后分治求等比数列,爆long long,要快速乘。

复杂度:O(log^3n)

 

upda:2018.10.12

你以为快速幂就这么简单???

其实可以更有趣一些。

与其说快速幂本质是二进制拆分,不如说是进制拆分。

因为,我们可以10进制快速幂!!!

应用于高精快速幂。

因为/2是O(len)的,除法复杂度太高 。

而如果高精用10进制存储,可以10进制快速幂!!每次干掉低位,类比于二进制下的左移和右移。

复杂度也是logn的。第24条。

 

快速幂快吗?很快。但是还是logn的。

如果要多次进行快速幂,那么每次logn的复杂度可能还是不能接受。

我们根据拆分的思想,如果指数在1e9范围内,那么A^k=A^([k/1e4]*1e4+k%1e4)=A^([k/1e4]*1e4)*A^(k%1e4)

可以尝试根号预处理。

 

upda:2019.1.19

延伸一下

分块预处理,可以称之为“光速幂”

然后

转载于:https://www.cnblogs.com/Miracevin/p/9734292.html

你可能感兴趣的文章
安装gulp及相关插件
查看>>
如何在Linux用chmod来修改所有子目录中的文件属性?
查看>>
Hyper-V 2016 系列教程30 机房温度远程监控方案
查看>>
笔记:认识.NET平台
查看>>
cocos2d中CCAnimation的使用(cocos2d 1.0以上版本)
查看>>
gitlab 完整部署实例
查看>>
GNS关于IPS&ASA&PIX&Junos的配置
查看>>
影响企业信息化成败的几点因素
查看>>
SCCM 2016 配置管理系列(Part8)
查看>>
struts中的xwork源码下载地址
查看>>
ABP理论学习之仓储
查看>>
我的友情链接
查看>>
PHP 程序员的技术成长规划
查看>>
python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
查看>>
js replace,正则截取字符串内容
查看>>
作业2
查看>>
nginx的信号量
查看>>
云im php,网易云IM
查看>>
开源 java CMS - FreeCMS2.3字典管理
查看>>
block,inline和inline-block概念和区别
查看>>