常用运算符
常用位运算操作
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