先把问题抛出。
快速幂:求mod m的值 a<=5000,b<=1e9 m<=50
快速加:求a*b mod m得值 a<=1e10 ,b<=1e10 m<=50
朴素算法稳爆炸,就不说了
快速幂:
求等价于 if b%2==1 if b%2==0
那么就可以写出如下递归函数
int pow(int x,int y){
if(y==0)return 1;
if(y&1){
int t=pow(x,y/2);
return t*t*x;
}else{
int t=pow(x,y/2);
return t*t;
}
}
由于递归常数较大,现在考虑改成迭代的方式,迭代需要考虑指数的二进制形式
int pow2(int x,int y){
int res=1;
while(y){
if(y&1){
res*=x;
}
x*=x;
y>>=1;
}
return res;
}
快速加:
类比上面 a*b = a*b/2+a*b/2+a if b%2==1 a*b/2+a*b/2 if b%2==0
然后就可以写出代码了
递归版本
int qad(int a,int b){
if(b==0)return 0;
if(b&1){
int t=qad(a,b/2);
return t+t+a;
}else{
int t=qad(a,b/2);
return t+t;
}
}
迭代版本
int qad2(int a,int b){
int res=0;
while(b){
if(b&1){
res+=a;
}
a+=a;
b>>=1;
}
return res;
}