由于计算机当中存储数字的形式都是二进制,所以如果我们直接对二进制进行操作效率会高很多:
所以能使用二进制的尽量使用二进制
1.第一次接触二进制应该是:子集枚举
2.第二次应该是状态压缩当中状态压缩
关于二进制以及位运算的知识:
这里引用一篇博客:https://blog.csdn.net/hzf0701/article/details/117359478
需要注意的一点是 右移和除法的区别, 右移动是向下取整,但是c++当中是像零取整
这里特别注意这几个用法要经常使用并且熟悉:
位运算实现乘除法
位运算交换两整数
位运算判断奇偶数
位运算改变正负性
位运算求绝对值
n的二进制表示第k位是几:n >> k & 1
返回x的最后一位1(表示的整数):(lowbit)x & -x
位运算统计二进制数1的个数
取最低位的1 11,lowbit函数
acwing 基础课题解笔记:
统计1的个数的题目有两种做法,一个是用lowbit,然后每次都减去最后一位1,直到为零
在一个是统计每一位,看看最后一位是1还是0,如果是1,那就++,不是就不用统计,然后这个数字再向后移动一位就可以了
快速幂的板子:
#include <iostream>
using namespace std;
typedef long long LL;
int quick_pow(int a, int k, int p)
{
int res = 1 % p;
while (k) {
if (k & 1) {
res = (LL)res * a % p;//这里就要这样写
}
k >>= 1;
a = (LL)a * a % p;
}
return res;
}
int n;
int main()
{
cin >> n;
while (n--) {
int a, k, p;
cin >> a >> k >> p;
cout << quick_pow(a, k, p) << endl;
}
return 0;
}
注意 res 这个地方不要写成 +=