首页 > 编程语言 >位运算在算法中的应用

位运算在算法中的应用

时间:2024-01-26 23:56:16浏览次数:25  
标签:运算 int long 二进制 算法 应用 ans mod

快速幂

问题:

给定整数 \(a,\ b,\ p\) 计算 \(a^b\mod p\) \((1 \le a,b,p \le 10^9)\)

分析:

我们可以将 \(b\) 转换成二进制:

\[b = c_02^0+c_12^1+c_22^2+...+c_{k-1}2^{k-1} \]

其中 \(c_n\) 的取值为 \(0\) 或者 \(1\)

那么有:

\[a^b = a^{c_02^0+c_12^1+c_22^2+...+c_{k-1}2^{k-1}} \]

\[a^b = a^{c_02^0}a^{c_12^1}a^{c_22^2}...a^{c_{k-1}2^{k-1}} \]

并且我们知道

\[a^{2^{n}} = (a^{2^{n-1}})^2 \]

故我们只需要递推即可得出每个乘积项,当 \(c_n = 1\) 时累积到答案中即可。

代码:

int quickPower(int a, int b, int p) {
    int ans = 1 % p;
    while (b) {
        if (b & 1) ans = (long long)ans * a % p;
        b >>= 1;
        a = (long long)a * a % p;
    }
    return ans;
}

例题:

89. a^b - AcWing题库


龟速乘

问题:

给定整数 \(a,\ b,\ p\) 计算 \(a\times b\mod p\) \((1 \le a,b,p \le 10^{18})\)

分析:

由于long long只能存 \(9\times 10^{18}\) 这么大的数,所以我们要想办法让计算不溢出。根据快速幂的思想,我们可以把 \(b\) 分解成二进制

\[b = c_02^0+c_12^1+c_22^2+...+c_{k-1}2^{k-1} \]

然后有

\[a\times b = c_0a2^0+c_1a2^1+c_2a2^2+...+c_{k-1}a2^{k-1} \]

又因为

\[a2^n = (a2^{n-1})\times 2 \]

如果我们得到 \(a2^{n-1}\mod p\) ,然后计算 \((a2^{n-1})\times 2 \mod p\) 可以保证每一步都不溢出

同样当 \(c_i = 1\) 时将乘积项累加到答案中即可

代码:

long long mul(long long a, long long b, long long p) {
    long long ans = 0;
    while (b) {
        if (b & 1) ans = (ans + a) % p;
        a = (a * 2) % p;
        b >>= 1;
    }
    return ans;
}

例题:

90. 64位整数乘法 - AcWing题库


二进制状态压缩

将一个长度为 \(m\) 的 bool 数组用一个二进制整数表示并存储。

利用位运算实现原 bool 数组中对应下标元素的存取。

操作 运算
取出 \(n\) 的第 \(k\) 位 (n>>k) & 1
取出 \(n\) 的第 \(0\) ~ \(k-1\) 位(后 \(k\) 位) n & ((1<<k)-1)
将第 \(k\) 位取反 n xor (1<<k)
将第 \(k\) 位赋值 \(1\) n | (1<<k)
将第 \(k\) 位赋值 \(0\) n & (~(1<<k))

位运算的一个重要特点:在二进制表示下不进位,参与位运算的各个二进制位之间是独立无关的

例题:

998. 起床困难综合症 - AcWing题库


成对变换

对于非负整数 \(n\) ,我们发现:

当 \(n\) 为奇数时,\(n\ xor\ 1 = n-1\)

当 \(n\) 为偶数时,\(n\ xor\ 1 = n+1\)

因此,0和1、2和3、4和5...都是关于xor 1运算成对变换

常用于邻接表中无向边的存取


lowbit运算

lowbit(n) 定义为非负整数 \(n\) 在二进制表示下“最低位的 \(1\) 及其后边的所有 \(0\)”构成的数值。

因为在计算机中 \([-x]_补 = [x]_补\ 按位取反 + 1\)

所以有

\[lowbit(n) = n\ \&\ (\sim n+1) = n\ \&\ (-n) \]

通过 lowbit 运算,我们可以找到整数二进制表示下所有是 \(1\) 的位:

迭代计算 \(n = n - lowbit(n)\) 直到 \(n\) 为 \(0\),减掉的数就是所有二进制是 \(1\) 的位与后面的 \(0\) 构成的数值,然后通过取对数 \(log_2x\) 即可得出位置。

这里求对数可以预处理,建立一个长度为 \(37\) 的数组 \(H\) ,令 \(H[2^k \mod 37] = k\) ,有一个小技巧,\(\forall k \in [0,35], 2^k \mod 37\) 互不相等。

int H[37];
for (int i=0;i<37;i++) H[(1ll << i) % 37] = i;
while (cin >> n) {
    while (n > 0) {
        cout << H[(n & -n) % 37];
        n -= (n & -n);
    }
}

lowbit也是树状数组的一个基本运算

标签:运算,int,long,二进制,算法,应用,ans,mod
From: https://www.cnblogs.com/juniexd/p/17990961

相关文章

  • 动态区间求和——树状数组的基本应用
    目录前言问题引入思路一览具体分析前言准确来说,不应该叫做动态区间求和问题,只能说树状数组经常用于求和操作而已,但是正常的动态条件查询树状数组也是可以做的,具体的下面再说吧问题引入给出一个数组a[],要求做两种操作,一种是修改数组中的一个数,一种是实现查询区间[lt,rt](lt<=......
  • 如何学习算法:什么时完全二叉树?完全二叉树有什么特点?
    完全二叉树我们知道树是一种非线性数据结构。它对儿童数量没有限制。二叉树有一个限制,因为树的任何节点最多有两个子节点:左子节点和右子节点。什么是完全二叉树?完全二叉树是一种特殊类型的二叉树,其中树的所有级别都被完全填充,除了最低级别的节点从尽可能左侧填充之外。完全二叉树的......
  • nodejs雪花ID算法(SnowflakeID)
    前言项目中常使用的三种id类型,分别是自增id、uuid、雪花id,这三种各有优劣。本篇主要实现nodejs中snowflake算法的代码。一、Snowflake实现这里需要加入big-integer的模块,下载npminstall--save big-integervarSnowflake=(function(){functionSnowflake(_......
  • FluentValidation在C#的应用
    FluentValidation在C#WPF中的应用  1.引言在.NET开发领域,FluentValidation以其优雅、易扩展的特性成为开发者进行属性验证的首选工具。它不仅适用于Web开发,如MVC、WebAPI和ASP.NETCORE,同样也能完美集成在WPF应用程序中,提供强大的数据验证功能。本文将深入探讨如何在C#......
  • RIPEMD加密技术探究:优势、劣势与实战应用
    摘要:RIPEMD加密算法作为一种哈希算法,自1989年诞生以来,因其高效、安全的特性在网络安全领域得到了广泛的应用。本文将对RIPEMD算法的优缺点进行详细分析,并给出一个Java完整的示例代码。同时,本文还将列举10个实际应用场景,帮助读者更好地理解这一加密技术的实际价值。RIPEMD在线......
  • 算法题总结
    1、接雨水Leetcode给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。输入:height=[0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组[0,1,0,2,1,0,1,3,2,1,2,1]表示的高度图,在这种情况下,可以接6个单位的雨水(蓝色部分表示......
  • 代码随想录算法训练营第三天| 203.移除链表元素,707.设计链表 ,206.反转链表
    203.移除链表元素给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val==val 的节点,并返回 新的头节点 。题目链接:203.移除链表元素-力扣(LeetCode)注意c++中NULL和nullptr的区别。应该用nullptr来表示空指针。/***Definitionforsingly......
  • [office] 将模拟运算表转换为图表
    如果需要更加直观地查看和比较数据,还可以将计算结果转换为图表,下面就将双变量模拟运算表转换为图表,将模拟运算表转换为图表操作方法如下:1、在工作表Sheet6中对表格进行美化。选择单元格B2,按下Delete键,将计算结果清除。图12、选择单元格区域A2:E8,切换到【插入】选......
  • 一眼看懂鸿蒙OS 应用隐私保护
    随着移动终端及其相关业务(如移动支付、终端云等)的普及,用户隐私保护的重要性愈发突出。应用开发者在产品设计阶段就需要考虑保护的用户隐私,提高应用的安全性。HarmonyOS应用开发需要遵从其隐私保护规则,在应用上架应用市场时,应用市场会根据规则进行校验,如不满足条件则无法上架。数据......
  • 探索图像检索:从理论到实战的应用
    本文深入探讨了图像检索技术及其在主流APP中的应用,涵盖了特征提取、相似度计算、索引技术,以及在电商、社交媒体和云服务中的实际应用案例。关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里......