二进制gcd(Binary gcd)
人形魔芋
前置知识: \gcd (最大公约数),位运算
众所周知利用欧几里得算法(辗转相除法)可以做到在 \log 的时间复杂度内求出两个数的最大公约数
如果直接辗转相除硬求 \gcd 就会 T 得飞起,但是题解里那种方法 \Theta(值域) 预处理 \Theta(1) 查询又好麻烦,那么有没有一种更快的直接求两个数 \gcd 的方法呢?
二进制 \gcd 就是这样一种算法,它利用计算机优秀的二进制处理能力来计算 \gcd
假设现在我们需要求 \gcd(a,b) 满足 a,b>0
我们将 a,b 分为 5 种情况讨论
第一种, a=b 。显然 \gcd(a,b)=a=b
第二种, a=0 或 b=0 。根据最大公约数的定义当 b=0 时 \gcd(a,b)=\gcd(a,0)=a ,当 a=0 时 \gcd(a,b)=\gcd(b,0)=b
第三种, a,b 均为偶数。对于这种情况,显然 2 是公约数之一,直接将两个数都除以 2 ,再递归下去求 \gcd(\frac a2,\frac b2) 即可, \gcd(a,b)=2\cdot\gcd(\frac a2,\frac b2)
第四种, a,b 中有且仅有一个偶数。不妨设 a 是偶数,那么显然 2 不是公约数之一,直接将 a 除以 2 求 \gcd(\frac a2,b) 即可, \gcd(a,b)=\gcd(\frac a2,b)
第五种, a,b 均为奇数。不妨设 a>b ,那么有 \gcd(a,b)=\gcd(\frac2,b) ,为什么呢?下面来证明一下
设 a=k_1\gcd(a,b),\ b=k_2\gcd(a,b) 且 \gcd(k_1,k_2)=1 ,先考虑证明 \gcd(a-b,b)=\gcd(a,b) (即“更相减损术”)
a-b=(k_1-k_2)\gcd(a,Binary.com 经纪人审查和测试 b),\ b=k_2\gcd(a,b) ,那么有 \gcd(a-b,b)=\gcd(k_1-k_2,k_2)\cdot\gcd(a,b) ,即证 \gcd(k_1-k_2,k_2)=1
考虑反证法,假设 \gcd(k_1-k_2,k_2)=m 其中 m\in\mathbb,m>1 ,再设 k_1-k_2=t_1m,\ k_2=t_2m
就有 k_1=(t_1+t_2)m ,那么 \gcd(k_1,k_2)=m\cdot\gcd(t_1+t_2,t_2)>1 与 k_1,k_2 互质矛盾,得证 \gcd(k_1-k_2,k_2)=1
由于 a,b 均为奇数, a-b 就是偶数,那么问题就变成了和情况四一样, 2 显然不是公约数之一,故 \gcd(a,b)=\gcd(\frac2,b)
直接根据上图模拟,我们可以得到以下代码(注意: ~ 的运算优先级高于 | 和 & Binary.com 经纪人审查和测试 )
首先把两个数公约数中的所有 2 提出来,也就是把二进制末尾的 0 全部提出来,然后两个数就至少有一个是奇数,把两个数末尾的 0 再分别去掉就能保证一定是两个奇数,利用更相减损术循环求解就行,具体看代码
注意到每次还是都使用 while 来去除二进制下末尾的 0 ,效率低下,可以利用硬件函数 __builtin_ctz() 来继续加速
同时只有直接输入 0 时才可能 a=0 或是 b=0 ,所以如果输入保证不为 0 就可以去掉这个判断
这样我们就成功地利用 \Theta(\log n) 求 \gcd 切掉了 Luogu P5435 这道需要 \Theta(\text) 预处理 \Theta(1) 求 \gcd 的题目
MySQL主从复制详细介绍
TimeFriends 于 2022-08-18 13:45:18 发布 634 收藏 92
一、主从复制的目的
二、主从复制的原理和步骤
简单的说就是master将数据库的改变写入binary log二进制日志,这个日志会记录下所有修改了数据库的SQL语句(insert,update,delete,grant等),slave同步这些二进制日志,并根据这些二进制日志进行数据操作,其实就是把主服务器上的binary log复制到从服务器上执行一遍,这样从服务器上的数据就和主服务器上的数据相同了。
5.从节点启动另外一个线程(sql Thread ),把replaylog中的事件读取出来,并在本地再执行一次。
三、复制中线程的作用
Dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向从节点发送二进制事件。
如果从节点需要作为其他节点的主节点时,是需要开启二进制日志文件的。这种情况叫做级联复制。如果只是作为从节点,则不需要创建二进制文件。
四、主从复制配置过程
3.创建有复制权限的用户账号 replication slave。
· 添加:expire_logs_days=7(自动清理 7 天前的log文件,可根据需要修改)
4.3.4 在从节点配置访问主节点的参数信息
添加 主节点主机,访问主节点的用户名及密码,主节点二进制文件信息。
4.3.5 查看从节点的状态信息
因为没有启动 从节点的复制线程,I/O线程和SQL 线程都为NO.
使用start slave命令启动从节点的复制线程,再利用show slave status命令查看当前的从节点状态。
五、错误排查总结
- 查看是否使用了nat的网络结构到导致网络有问题,连接不上。
- 有可能my.cnf有问题,配置文件
- 授权的问题,replication slave和file权限是必须的。
- 查看是否使用了nat的网络结构到导致网络有问题,连接不上。
- 有可能my.cnf有问题,配置文件
- 授权的问题,replication slave和file权限是必须的。
关于MySQL主从复制,你学废了么?
真诚地邀请您加入我们的大家庭.
在这里不仅有技术知识分享,还有博主们之间的互帮互助
不定期发红包,每月更有抽奖环节,游戏机和实体书相赠(包邮)
让我们抱团取暖,抱团内卷.打造美好C站.期待您的加入.
备注 : CSDN-xxxxxx (xxxxxx代表你csdn的昵称)
来源:公众号「神谕的暗影长廊」 在异步或半同步的复制结构中,从库出现延迟是一件十分正常的事。 虽出现延迟正常,但是否需要关注,则一般是由业务来评估。 如:从库上有需要较高一致性的读业务,并且要求延迟小于某个值,那么则需要关注。 简单概述一下复制逻辑: 1、主库将对数据库实例的变更记录到binlog中。 2、主库会有binlog dump线程实时监测binlog的变更并将这些新的events推给从库(Master has sent all binlog to slave; waiting for more updates) 3、从库的IO Thread接收这些events,并将其记录入re
主要介绍了MySQL主从复制配置心跳功能介绍,解决Slave has read all relay log; waiting for the slave I/O Binary.com 经纪人审查和测试 thread to update it问题,需要的朋友可以参考下