算法进阶:0x01 位运算
一、快速幂的模板代码 a^b%p:
#include<iostream> using namespace std; int main() { int a,b,p; cin>>a>>b>>p; int res = 1 % p; while (b) { if (b & 1) res = res * 1ll * a % p; b >>= 1; a = a * 1ll * a % p; } cout<<res<<endl; }
注意点:
1、转换成long long类型可以直接乘1ll,作用与(long long)相同,范围大概为10^19,int为2 147 483 647。
2、以2^7为例,7 = 4(2^2) + 2(2^1) + 1(2^0);二进制形式为111,b&1为获取最后一位是否为1,b>>=1舍弃最后一位。
3、如果测试数据为123456789 0 1,res=1没有%p的话,那么结果就是1,正确应为0,所以应该初始化res就%p,res = 1 % p。
4、memset(a, val, sizeof(a))把数值val(0x00~0xFF)填充到数组a的每个字节上,一个int占用4个字节,所以用memset只能赋值出“每8位都相同”的int。0x3F3F3F3F(1 061 109 567)的两倍不超过0x7F7F7F7F(2 147 483 647),memset(a, 0x3F, sizeof(a))。0xFFFFFFFF为-1。
二、如果a, b, p范围是10^18,求a*b%p
1、那么为了不超过范围,首先得用usigned long long,2*10^19。乘法转化为加法,a^b = a * a * …… * a。a * b = a + a + ……+a。
a * 1 = 2^0 * a,
a * 2 = 2^1 * a,
a * 4 = 2^2 * a,
a * 8 = 2^3 * a,
a * 2^k = 2^k * a。
一共k+1次,k为logb级别。
#include<iostream> using namespace std; typedef unsigned long long ULL; int main() { ULL a,b,p; cin>>a>>b>>p; ULL res = 0; while (b) { if (b & 1) res = (res + a) % p; b >>= 1; a = a * 2 % p; } cout<<res<<endl; }
最短Hamilton路径:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?