快速幂的实现
洛谷P1226
题目描述
输入b,p,k的值,求b^p mod k的值。其中b,p,k*k为长整型数。
输入格式
三个整数b,p,k.
输出格式
输出“b^p mod k=s”
s为运算结果
输入输出样例
输入 #1 2 10 9 输出 #1 2^10 mod 9=7 一道位运算入门经典题,几乎所有讲算法的书籍都有所提及,此处就依照李煜东《算法进阶指南》书中指导进行讲解(实际上,理解以后没啥好讲的) 考虑如下: 对于正整数b,一定可以唯一表示为若干指数不重复的2的次幂的和。 因此,不妨设b在二进制下有k位,其中第i(0<=i<k)位的数字是ci(ci=0或1),那么有: b=ck-1*2^(k-1)+ck-2*2^(k-2)+…+c0*2^0 则必有: a^b=a^(ck-1*2^(k-1))*a^(ck-2*2^(k-2))*…*a^(c0*2^0) (请参考书中式子,避免误解) k=[log2(b+1)](向上取整),故上式乘积项不多于[log2(b+1)] 所以仅需求出上式的每一项mod p的值 通过a^(2^i)=(a^(2^(i-1)))^2每一次不断改变a的值使其变为两倍,及b>>1向右不断移位,并判断b的最末尾是否是1,达到快速取模运算的效果 实际上,该算法时间复杂度应为O(log2n)#include<iostream> #include<cstdio> using namespace std; int power(int a,int b,int p){ int ans=1%p; while(b>0){ if(b&1)ans=(long long)ans*a%p; //b&1可以取出b在二进制下最低位 b>>=1;//移位,比b/2快 a=(long long)a*a%p;//改变数值 } return ans; } int main(){ int a,b,p; scanf("%d%d%d",&a,&b,&p); printf("%d^%d mod %d=%d\n",a,b,p,power(a,b,p)); return 0; }快速幂模板
标签:运算,int,long,算法,ans,快速,mod 来源: https://www.cnblogs.com/zach20040914/p/11406253.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。