有很多问题,是可以用二进制位来实现的,可以避免超时、爆long long 等问题。关于位运算,在这里以两道例题为例。
之前也写过一篇也名为位运算的一篇博客,戳我跳转
关于位运算,碰到新的知识,也还会持续更新补充的。
快速幂
小编之前写过一篇专门的快速幂博客,点击链接可参考
戳我
用乘法来实现乘方。
位整数乘法
题目链接:戳我
题目描述:
分析:
-
用加法实现乘法。也称
龟速乘
;
long long 的范围大概是9 * 10^8
-
当我们把a加b次,会超时。
-
举个栗子啦,b 的2进制表示:11010,
b=2^1 + + 2^3 + 2 ^ 4
ab = 2 ^1 * a + 2 ^3 * a + 2 ^ 4 * a
-
原理同快速幂差不大,代码如下。
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
LL qadd(LL a, LL b, LL p){
LL res = 0;
while(b){
if(b & 1) res = (res + a) % p;
a = (a + a) % p;
b >>= 1;
}
return res;
}
int main(void){
LL a, b, p;
cin >> a >> b >> p;
cout << qadd(a, b, p);
return 0;
}