1 . 二分查找
//A[]为递增序列,x为欲查询的数,函数返回第一个大于等于x的元素的位置
//二分上下界为左闭右闭,[left,right],传入的初值为[0,n]
int lower_bound(int A[],int left,int right, int x){
int mid;
while(left<right){ //对于[left,right]来说,left==right意味着找到唯一位置
mid=(left+right)/2;
if(A[mid]>=x)
right=mid; //往左子区间[left,mid]查找
else
left=mid+1; //往右子区间[mid+1,right]查找
}
return left; // 返回夹出来的位置
}
//A[]为递增序列,x为欲查询的数,函数返回第一个大于x的元素的位置
//二分上下界为左闭右闭,[left,right],传入的初值为[0,n]
int upper_bound(int A[],int left,int right,int x){
int mid;
while(left<right){
mid=(left+right)/2;
if(A[mid]>x)
right = mid;
else
left=mid+1;
}
return left;
}
2. 二分的思想还可应用到求解方程,例如求解根2
const double eps = 1e-5; //精度
double f(double x){ //计算f(x)
return x*x-2;
}
double solve(double L,double R){
double left=L,right=R,mid;
while(right-left>eps){
mid=(left+right)/2;
if(f(mid)>0){
right=mid;
}else{
left=mid;
}
}
return mid; //所返回的当前mid值为f(x)=0的根
}
3. 快速幂问题,求a^b%m
Note:条件if(b%2==1) 括号里可以用b&1代替,这里b&1进行位与操作,判断b的末位是否为1,因此当b为奇数时b&1返回1,if条件成立
//递归快速幂
typedef long long LL;
//求a^b %m , 递归写法
LL binaryPow(LL a,LL b,LL m){
if(b==0) return 1; //如果b为0,那么a^0=1
// b为奇数,转换为b-1
if(b%2==1) return a*binaryPow(a,b-1,m)%m;
else { //b为偶数,转换为b/2
LL mul = binaryPow(a,b/2,m);
return mul*mul%m;
}
}
//迭代快速幂
typedef long long LL;
LL binaryPow(LL a,LL b,LL m){
LL ans =1;
while(b>0){
if(b&1){ //如果b为奇数
ans=ans*a%m; //令ans累积上a
}
a=a*a%m; //令a平方
b>>=1; // 将b的二进制右移一位,即b=b/2
}
return ans;
}