ACM学习记录--位运算

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 运算是树状数组中的基本操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值