【算法学习】 位运算

常用运算符

在这里插入图片描述

常用位运算操作

1.求n的第K位数字:n>>k&1
2.返回n的最后一位1:lowbit(n)=n&-n
3.判断x为奇数:x&1==1
4.判断x为偶数:x&1==0
5.去掉从右边数第一个1的左边:x&-x
eg:100101000->10010
6.去掉最后一位(相当于除以2):x>>1
7.在最后加一个0(相当于乘以2):x<<1

模运算

1.(a + b) % p = (a % p + b % p) % p
2.(a - b) % p = (a % p - b % p ) % p
3.(a * b) % p = (a % p * b % p) % p
4.(a^b) % p = ((a % p)^b) % p
5.((a+b) % p + c) % p = (a + (b+c) % p) % p
6.((a*b) % p * c)% p = (a (bc)%p) % p
7.((a +b)% p * c) % p = ((a * c) % p + (b * c) % p) % p

位运算练习

A a^b

在这里插入图片描述

示例1

输入:
2 3 9
输出:
8
#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long a,b,p;
    long long res=1;
    cin>>a>>b>>p;
    while(b)
    {
      if(b&1)  res=(res*a)%p;
      b>>=1;
      a=(a*a)%p;
    }
    cout<<res%p<<endl;
}

B Raising Modulo Numbers

在这里插入图片描述
在这里插入图片描述
示例1
输入

3
16
4
2 3
3 4
4 5
5 6
36123
1
2374859 3029382
17
1
3 18132

输出

2
13195
13

C 64位整数乘法

在这里插入图片描述
示例1
输入

2
3
9

输出

6
#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long a,b,p;
    long long res=0;
    cin>>a>>b>>p;
    while(b)
    {
        if(b&1) res=(res+a)%p;
        a=(a+a)%p;
        b>>=1;
    }
    cout<<res%p<<endl;
}

D 最短Hamilton路径

在这里插入图片描述
示例1
输入

4
0 2 1 3
2 0 2 1
1 2 0 1
3 1 1 0

输出

4

在这里插入图片描述

E 起床困难综合症

在这里插入图片描述
在这里插入图片描述
示例1
输入

3 10
AND 5
OR 6
XOR 7

输出

1

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值