快速幂
a^b%p=??
暴力O(b) 当然不可以!!
两种解决思路:
• 分治
• 快速幂
快速幂(正常操作)
举个例子:
计算
a^7 把它拆分:a^7 = a^1 * a^2 * a^4
a^11 把它拆分:a^11 = a^1 * a^2 * a^8
a^25 把它拆分:a^25 = a^1 * a^8 * a^16
首先计算出 a^1、 a^2、 a^4、 a^8 …
观察后发现可以把那要计算的幂分解成二次方的形式,如果b是奇数的话,最后乘以单个a就好啦
代码:
int quickpow(int a,int b,int n) { int ans=1; while(b) { if(b%2==1) ans=ans*a%n; a=a*a%n; b/=2; } return ans; }
强烈安利,因为好写
分治
比如求3^5
也就是由3^2 , (3^2)^2 , 最后(3^2)^2*2得来
。。。其实就是递归了一下。。。和上面的方法没有本质区别
代码:
int calc(int a,int b,int c) { if(b==1) return a; int tmp=calc(a,b/2,c); tmp=tmp*tmp%c; if(b%2==1) tmp=tmp*a%c; return tmp; }