首页 > 其他分享 >位运算

位运算

时间:2024-07-10 19:08:35浏览次数:15  
标签:10 frac 运算 二进制 复杂度 times 算法

a^b

算法:快速幂。

考虑一些经典的分类讨论:

  • $b$ 为奇数,此时分解为 $a^{\frac{b-1}{2}}\times a^{\frac{b-1}{2}}\times a$。

  • $b$ 为偶数,此时分解为 $a^{\frac{b}{2}}\times a^{\frac{b}{2}}$。

我们的边界为 $a$,因为这是已经给出的。

所以我们发现,每次 $b$ 会减少一半,时间复杂度 $O(log b)$,在 $b\le 10^9$ 时可以轻松通过。

增加模数

算法:快速幂。

先考虑暴力枚举,$b_i$ 的极限是 $10^7$,所以我们要进行 $4.5\times 10^{13}$ 次运算,这是一定会超时的,所以考虑优化。

发现 $b_i$ 数据范围很大,于是考虑用快速幂优化,对于 $a_i^{b_i}$ 这样的式子可以快速计算,这样时间复杂度是 $O(Tmlog b)$,可以通过。

64位整数乘法

算法:龟速乘。

发现 $a\times b$ 显然会爆 $long$ $long$,所以我们有 $2$ 种方案:

  • 使用高精度,但这样不够优美。

  • 使用龟速乘。

我们可以把 $a$ 加上 $b$ 次,比较显然地,$b$ 可以被拆成一个二进制数,我们把二进制是 $1$ 的位加上即可。

具体地,每次把当前的数乘 $2$,判断 $b$ 的二进制表示中第 $i$ 位是不是 $1$,如果是 $1$,答案加上 $2^i\times a$,这里可以每次把 $a$ 乘 $2$ 并取模,就不会爆掉了。

时间复杂度 $O(log b)$,可以轻松通过。

最短Hamilton路径

算法:状态压缩,动态规划。

这里先提出一种新的动态规划分析方式:

我们把一个状态看作一个集合,既然是集合,里面就有元素,我们根据题目的要求把这个状态的数组记为这个集合的一个特殊值(例如:最大值,最小值,总和,数量之类的),就是属性。

接下来分析一下状态,$f_{i,j}$ 表示所有从 $0$ 走到 $j$,走过点的二进制表示为 $i$ 的路程的最小值。

然后想一想怎么转移,我们可以枚举 $j$ 的上一个点记为 $k$,所以 $f_{i,j}$ 可以由 $f_{i-2^j,k} + a_{k,j}$ 转移而来,即转移方程为 $f_{i,j}=\min(f_{i,j},f_{i-2^j,k} + a_{k,j})$。

起床困难综合症

算法:位运算。

标签:10,frac,运算,二进制,复杂度,times,算法
From: https://www.cnblogs.com/zxh923aoao/p/18294826

相关文章