标签:右移 19 long 一位 二进制 算法 ans 2022.7 mod
快速幂
快速幂以下简称(fpow)是math.h或cmath里的内置函数pow的升级版(只不过是比pow快了一些)
2022.7.19 SD夏令营具体学了学快速幂,这次修改主要是改了改思想和具体操作,原理不变
原理:
通过将指数拆分成几个因数相乘的形式,来简化幂运算。
具体操作:
将指数转化为二进制,如果这一位上是1,那就乘上这一位上的信息(即x的几次方,按照二进制的规则来即可)
二进制位数 ......4 3 2 1
对应的十进制 ......x^3 x^2 x^1 x^0
模拟一下以便于理解
e.g. 我们算3的10次方,10的二进制为1010,首先,最后一位为0,x*=x,因为二进制的每向左移一位,就更新为原来的二次方,右移。
现在,最后一位为1,那么答案乘上x,更新x,右移。
最后一位为0,x*=x,右移。
最后一位为1,ans*=x,x*=x,右移,没有位数了,退出。
代码:
//long long fastpower(long long,long long,long long);//觉得函数主体碍眼就打函数声明 long long fastpower(long long x,long long y,long long mod) { long long ans=1; while(y) { if(y&1)//位运算 等价于y%2==1 这里判断指数的二进制位数上是否为1,以此来决定要不要乘 { (ans*=x)%=mod;//记得取模,看题目要求 } y>>=1;//位运算 将最后一位移除; x*=x;//更新位数上的信息,即x的几次幂 } return ans%mod; }
位运算可以提高速度(可能快不了多少,但很高大上)
标签:右移,19,long,一位,二进制,算法,ans,2022.7,mod 来源: https://www.cnblogs.com/yifan0305/p/16391435.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。