0x01 位运算
0x01 位运算
定义
bit
是度量信息的单位,包含\(0\)和\(1\)两个汇总状态,这种操作的速度很快!!!
首先来定义一下算术位运算
与:\(and,\&\)
或:\(or,|\)
非:\(not,~\)
异或:\(xor,ˆ\)
(\(ˆ\)这个符号通常不实用)
移位运算
左移
\[1<<n = 2^n\,\,\,n<<1=2n
\]
右移
算数右移
\[n>>1 = \left \lfloor \frac{n}{2.0} \right \rfloor
\]
逻辑右移
略(基本上不会用到)
\(aˆb^{\,\,CH0101}\)
\[求a的b次方对p取模的值,其中1\leq a,b,p \leq10^9
\]
标准算法(跟位运算无关)
#include <iostream> using namespace std; int main() { int a, b, p; cin >> a >> b >> p; unsigned long long ans = 1; for (int i = 0; i < b; i++) { ans *= a; ans %= p; } cout << ans << endl; return 0; }
如果去评测:恭喜你
TLE
因为大数据肯定超时。
于是就需要快速幂!
long long power(int a,int b,int p){ int ans = 1%p; for(;b;b>>=1) //for(;b;b/2.0) { if(b&1)ans = (long long)ans*a%p; a=(long long)a*a%p; } return ans; }
问题又来了,如果遇到这道题
\(64\text{位整数乘法}^{CH0102}\)
\[求a的b次方对p取模的值,其中1\leq a,b,p \leq10^{20}
\]
那就不香了,连\(long\,\,long\)都存不下了,那就尴尬了。
方法一
类似于快速幂,把\(b\)用二进制表示,得到结果。
\[b = c_{k-1}\cdot 2^{n-1} + c_{k-2}\cdot 2^{n-2} + \cdots + c_{0}\cdot 2^{0}
\]
\[\text{于是}a\cdot b = c_{k-1}\cdot 2^{n-1} \cdot a + c_{k-1}\cdot 2^{n-1} \cdot a + \cdots +c_{0}\cdot 2^{0} \cdot a
\]
\[\because a\cdot 2^i = (a\cdot 2^{i-1})\cdot 2 \text{在运算时每一项都不会超过}2 \cdot 10^{18}
\]
\[\therefore \text{这种方法很香啊,而且时间复杂度是} O(log_2 b)!!!
\]
#define ll long long ll mul(ll a, ll b, ll c){ long long ans = 0; for(; b; b >>= 1){ if (b & 1) ans = (ans + a) % p; a = a * 2 % p; } return ans; }
方法二
利用$ a\cdot b,,mod,,p =,,a,,*,,b ,,-,,\lfloor \frac{a\cdot b}{p} \rfloor \cdot p$ 这个公式。
首先, \(a , b \le p\) 时,这个可以直接完成运算,英文我们不需要其他的精度位,而如果数据很大,只需要考虑比较低位的数据,那就很香了。
#define ll long long ll mul(ll a, ll b, ll c){ a %= p, b %= p; ll c = (long double) a * b / p; ll ans = a * b - c * p if (ans < 0) ans += p; else if (ans >= p) ans -= p; return ans; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现