快速幂详解
来源:互联网 发布:cms系统源码 编辑:程序博客网 时间:2024/06/03 22:08
1.首先说快速幂是用处:
快速幂顾名思义,就是快速算某个数的多少次幂。
其时间复杂度为 O(lgN) 比朴素的O(N)快了不知多少啊!!!
以下以求a的b次方来介绍
2.快速幂的原理:
把b转换成2进制数
该2进制数第i位的权为a^(2^(i-1))
例如
a^11=a^(2^0+2^1+2^3)
11的二进制是1011
so:我们将a^11转化为算a^(2^0)*a^(2^1)*a^(2^3)
3.那么要怎么实现呢??位运算是强大的工具!!
b and 1 //也就是取b的二进制最末位
b shr 1 //就是去掉b的二进制最末位
有了这个强大的工具,快速幂就好实现了!
var a,b,n:int64;
function f(a,b,n:int64):int64;
var t,y:int64;
begin
end;
begin
read(a,b,n); // n是模
write(f(a,b,n));
end.
下面是代码实现比较:
常规求幂
int pow1( int a, int b ){ int r = 1; while( b-- ) r *= a; return r;}
二分求幂(一般)
int pow2( int a, int b ){ int r = 1, base = a; while( b != 0 ) { if( b % 2 ) r *= base; base *= base; b /= 2; } return r;}
快速求幂(位操作)
int pow3( int a, int b ){ int r = 1, base = a; while( b != 0 ) { if( b & 1 ) r *= base; base *= base; b >>= 1; } return r;}
快速求幂(更高效率的位运算法)
int pow4(int x, int n){ int result; if (n == 0) return 1; else { while ((n & 1) == 0) { n >>= 1; x *= x; } } result = x; n >>= 1; while (n != 0) { x *= x; if ((n & 1) != 0) result *= x; n >>= 1; } return result;}
0 0
- 快速幂详解
- 快速幂 -- 算法详解
- 快速模幂详解
- 矩阵快速幂详解
- 【快速幂详解】
- 快速幂算法详解
- 快速乘法/幂 算法详解
- 矩阵快速幂 非详解
- 算法提高快速幂(快速幂算法详解)
- 快速幂 矩阵快速幂思想详解及例题
- 快速幂的详解(转载)
- 快速幂详解以及例题解析
- 快速幂详解——codevs 1497
- 暗黑破坏神快速RR详解
- 快速排序详解
- 快速排序(详解)
- 快速排序法详解
- 快速排序详解
- ecshop商品列表修改js点击自动更新
- LUA源码中涉及到的数据结构
- 无ARP欺骗的嗅探技术
- __VA_ARGS__用法
- Windows编程命名规则
- 快速幂详解
- CreateProcess分析之NtCreateProcessEx() 的分析
- 什么是音频视频比特率,采样率,讲的很不错
- LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- RandomAccessFile
- 名词解释WEB,EJB,JNDI,JMS,JTA,JAF,RMI/IIOP
- RadioButtonList 的项平行显示,且与后边的控件在一行,不换行。
- 精简
- 学习的阶段总结