求幂&&快速幂&&位运算
2024-08-30 07:25:20
1.普通的求幂方法:
时间复杂度为O(n),对于比较大的数在1s限时内可能会TLE
int pow(int base,int p){
int ans=1; for(int i=1;i<=p;i++)
ans*=base; return ans;
}
2.快速幂:
时间复杂度为logn
(1)结合位运算
原理:指数p可转化为2进制形式
则basep=basei(1)*2^0+i(2)*2^1+i(3)*2^2+……
=basei(1)*2^0*basei(2)*2^1*basei(3)*2^2*……
当i(n)=0时相当于乘了1,也就相当于什么也没乘,而每次待乘的数都是base2^k,乘不乘由系数i(k+1)决定,但不管乘不乘,下一次待乘的数都是base2^(k+1)即base2*2^k也就是(base2^k)2。
代码实现:
long long fastpow(long long base,long long p){
long long ans=1; while(p!=0){
if(p&1!=0)//如果这一位(二进制最后一位)为1,则乘上待乘的数(或P%2==1)
ans*=base; base*=base;
p>>=1;(或者p/=2)
} return ans;
}
(2)结合模运算
我们知道basep%d=(base%d)*(base%d)*(base%d)*……%d
=(base%d)p%d
上代码:
long long fastpowmod(long long base,long long p,long long d){
long long ans=1;
base%=d; while(p!=0){
if(p&1!=0)
ans=ans*base%d; base=base*base%d;
p>>=1;
}
ans%=d;//0次方特判 return ans;
}
最新文章
- SpringMVC4零配置--web.xml
- synchronized的理解
- 一步一步学习Unity3d学习笔记系1.1
- web工程导入MyEclipse 就变成Java工程 ———— 解决方案
- kthread_stop引起的OOP
- 比较不错的一个ios找茬游戏源码
- Google code: Why ‘Everything up-to-date’ when pushing (git)
- easyui的datagrid组件,如何设置点击某行不会高亮该行的方式
- storyboard和xib的区别
- 用IDEA在Tomcat上部署项目
- python RE模块的使用
- 安装配置Kafka
- King 差分约束 判负环
- css实现div内一段文本的两端对齐
- Elastic Stack之kibana使用
- [CodeForces 1141A] Game 23
- pycharm中新建external tools
- spring事务传播
- FastDFS分布文件系统Java客户端集成
- TreeMap源码剖析
热门文章
- Codeforces Round #650 (Div. 3) A. Short Substrings
- HDU 1565 方格取数 状压dp
- 牛客编程巅峰赛S1第5场 - 青铜&;白银 A.凯撒密码(字符串)
- Dubbo从入门到实践
- 国产网络测试仪MiniSMB - 如何3秒内创建出16,000条UDP/TCP端口号递增流
- 实战交付一套dubbo微服务到k8s集群(6)之交付dubbo-monitor到K8S集群
- Hexo准备---Node.js、Vue
- Dapr是如何简化微服务的开发和部署
- cin 与 getline
- git commit guidelines