1.移位操作:
快速幂:
1.1求a的b次方对p取模的值,数据范围小于等于1e9;
int power(int a, int b, int p){ **//快速幂**
int ans=1%p;
while(b){
if(b&1)
ans=ans*a%p;
a=a*a%p;
b>>=1;
}
return ans;
}
算法思想很简单。将b视为二进制,按权展开即可。
1.2求a*b对p取模的值,数据范围小于等于1e18;此时,直接算乘法会超出数据范围,可以将b表示成二进制,分部计算即可。
typedef long long ll;
ll mul(ll a, ll b, ll p){
ll ans=0;
while(b){
if(b&1)
ans=(ans+a)%p;
a=a*2%p;
b>>=1;
}
return ans;
}
有关习题可以参考
POJ1995[快速幂]:
(https://blog.csdn.net/tirion_chenrui/article/details/88046744)
2.二进制状态压缩:
指将一个长度为m的bool数组用一个m位的二进制数表示并储存。
取出n在二进制下的第k位:(n>>k)&1
n在二进制下第k位赋值1:n=n|(1<<k)
n在二进制下第k位赋值0:n=n&(~(1<<k))
有关习题可以参考
CH0103最短Hamilton路径:(https://blog.csdn.net/tirion_chenrui/article/details/88081946)
3、lowbit 运算
lowbit(n) = n & (~ n + 1) = n & (-n);
表示为非负整数n在二进制表示下“最低位的1及其后边所有的0”所构成的数值。
lowbit 运算是树状数组中的基本操作。