首页 > 其他分享 >位运算

位运算

时间:2024-07-10 19:08:35浏览次数:7  
标签: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

相关文章

  • 浙大数据结构慕课课后习题(02-线性结构2 一元多项式的乘法与加法运算)
    题目要求设计函数分别求两个一元多项式的乘积与和。输入格式:输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。输出格式:输出分2行,分别以指数递降方式输出乘积多项式以及和多项......
  • C语言学习笔记(03)——常用运算符
    基本运算符*/inta=b*10; CPU可能多个周期,甚至要利用软件的模拟方法去实现乘法inta=b+10; CPU一个周期可以处理/取整%取余一般使用/和%配合得到小数,一般/的结果得到的是整数,除非: floata,b,c,d; a=7/2; b=7.0/2; c=7/2.0; d=7.0/2.0; printf......
  • Javase-3.运算符
    3.运算符1.算术运算符1.基本运算符:加减乘除模(+-*/%)inta=2;intb=1;System.out.println(a+b);//3System.out.println(a-b);//1System.out.println(a*b);//2System.out.println(b/a);//0int/int结果还是int类型,而且会向下取整System.out.print......
  • Python运算符
    一、算数运算符1.分类算数运算符有“+”,“-”,“*”,“/”,“%”,“//”,“**”这7种“%”用来求余,它通常用来判定奇数偶数或者倍数“//”用来求商,它返回的是整数“**”用来求某个数的次方,例如m**n就是求m的n次方a,b=10,20r=a/bprint(a+b,a-b,a*b,r,type(r))pri......
  • Python运算符
    1.算数运算符     算术运算符包括:“+,-,*,/,%,//,**”。        “%”为求余,通常用来判定奇偶或倍数;        “//”为整除,用于返回整数;        “**”为次方,优先级最高。a,b=3,9print(a+b,b-a,a*b,b/a)print(a**b)print(a**b/a)print......
  • 模电基础 - 集成运算放大电路
    目录一.简介二. 直接耦合放大电路三. 阻容耦合放大电路四. 变压器耦合放大电路五. 光电耦合六. 集成运放电路1.双集成运放电路2.单集成运放电路3.单集和双集混合一.简介集成运算放大电路简称集成运放,是一种具有高增益、高输入电阻和低输出电阻的直接耦合......
  • 从零开始学Java(超详细韩顺平老师笔记梳理)03——各类运算符、标识符关键字、进制转换、
    文章目录前言一、运算符(算术、关系、逻辑、赋值、三元)1.算术运算符2.关系运算符(比较运算符)3.逻辑运算符4.赋值运算符5.三元运算符TernaryOperator二、运算符优先级三、标识符规范与关键字1.标识符命名规则和规范2.关键字3.保留字四、键盘输入五、进制介绍转换,......
  • 数论知识(取模运算)
    若amodk=xa......
  • 语法2-运算符、包机制、JavaDoc
    语法运算符运算符具有优先级-网上查(一般使用括号保证)/-除,%-取余符号-21/10二十一除十取余数,幂运算使用工具类表示Math.pow(2,3)-2的3次方++自加,--自减inta=3;intb=a++;//输出a=4,b=3intb=++a;//输出a=4,b=4==-等于,!=-instanceof-不等于逻辑运算符-与或非-&......
  • 在Linux中,哪⼀个bash内置命令能够进行数学运算?
    在Linux中,bashshell提供了多种方式进行数学运算,但严格来说,bash本身并没有一个专门的内置命令专门用于数学运算,而是通过一些特殊的语法和命令组合来实现。以下是一些常见的bash中进行数学运算的方法:1.使用$((expression))进行算术扩展这是bash中推荐的标准处理方法,用于执行基本......