整除分块(上下取整)

参考:

整除分块 - 知乎

董晓算法 G33 整除分块(数论分块)

图都是摘的上面的。

整除分块

整除分块是数论中的一个知识点。一个整除式子在分母不固定的时候,得到的结果也有可能不同,但是因为是整除,所以分母在取连续的值的时候,算出的结果有可能是相同的。比如:
在这里插入图片描述

整除分块可以算出每段连续取值区间的左右端点。因为区间个数最多有 2 ∗ n 2*\sqrt n 2n 个,从而它可以 O ( n ) O(\sqrt n) O(n ) 遍历整除式子的所有取值和取值区间。

分块的性质:

  1. 分块的块数 ≤ 2 n \le 2\sqrt{n} 2n (也就是连续的相同取值的区间个数最多只有 2 n 2\sqrt{n} 2n 个)。

证明:
在这里插入图片描述

向下取整

性质: i i i 所在块的右端点为 r = ⌊ n ⌊ n i ⌋ ⌋ r=\left\lfloor\dfrac{n}{\left\lfloor\dfrac{n}{i}\right\rfloor}\right\rfloor r= inn

  • 证明:
    在这里插入图片描述
    我们通过这个性质可以用区间左端点算出右端点,通过右端点又可以得到下一段区间的左端点,循环下去就可以遍历所有区间(块)了。
code:
for(int l=1,r;l<=n;l=r+1){
	r=n/(n/l);
	...
}

向上取整:

向上取整有两种遍历方式,一个是从前向后( 1 → n 1\rightarrow n 1n),另一个是从后向前( n → 1 n\rightarrow 1 n1)。前者比较符合我们的直观思路,后者和前面的向下取整的过程高度对称,写法比较简洁。先说后者:

从后向前遍历:

性质: i i i 所在块的左端点为 l = ⌈ n ⌈ n i ⌉ ⌉ l=\left\lceil\dfrac{n}{\left\lceil\dfrac{n}{i}\right\rceil}\right\rceil l= inn

  • 证明是类似的:
    i i i 所在块的值 k = ⌈ n i ⌉ k=\left\lceil\dfrac{n}{i}\right\rceil k=in,则 k ≥ n i k\ge \dfrac{n}{i} kin,则 ⌈ n k ⌉ ≤ ⌈ n n i ⌉ = ⌈ i ⌉ = i \left\lceil\dfrac{n}{k}\right\rceil\le\left\lceil\dfrac{n}{\dfrac{n}{i}}\right\rceil=\left\lceil{i}\right\rceil=i kn inn =i=i
    所以 i m i n = ⌈ n k ⌉ = ⌈ n ⌈ n i ⌉ ⌉ i_{min}=\left\lceil\dfrac{n}{k}\right\rceil=\left\lceil\dfrac{n}{\left\lceil\dfrac{n}{i}\right\rceil}\right\rceil imin=kn= inn 。代码实现时,左端点 k = ( n + r − 1 ) / r , l = ( n + k − 1 ) / k k=(n+r-1)/r,l=(n+k-1)/k k=(n+r1)/r,l=(n+k1)/k
    同样的方法进行遍历,不过由于是从右端点算左端点,所以方向变成从后向前遍历了。
code:
for(int l,r=n,k;r>=1;r=l-1){
	k=(n+r-1)/r;
	l=(n+k-1)/k;
	...
}

从前向后遍历:

性质: i i i 所在块的右端点为 r = ⌊ n − 1 ⌊ n + i − 1 i ⌋ − 1 ⌋ r=\left\lfloor\dfrac{n-1}{\left\lfloor\dfrac{n+i-1}{i}\right\rfloor-1}\right\rfloor r= in+i11n1

  • 证明1:
    { k = ⌈ n i ⌉ = ⌊ n + i − 1 i ⌋ r = m a x ( i ) , i k ≤ n + i − 1 ⇒ r = ⌊ n − 1 ⌊ n + i − 1 i ⌋ − 1 ⌋ \begin{equation*} \begin{cases} k = \left\lceil\dfrac{n}{i}\right\rceil =\left\lfloor\dfrac{n+i-1}{i}\right\rfloor \\ r=max(i),ik\le n+i-1 \end{cases} \end{equation*}\Rightarrow r=\left\lfloor\dfrac{n-1}{\left\lfloor\dfrac{n+i-1}{i}\right\rfloor-1}\right\rfloor k=in=in+i1r=max(i),ikn+i1r= in+i11n1

  • 证明2:
    因为 k = ⌈ n i ⌉ k=\left\lceil\dfrac{n}{i}\right\rceil k=in,所以 i ( k − 1 ) < n ≤ i k i(k-1)\lt n\le ik i(k1)<nik n k ≤ i < n k − 1 \dfrac{n}{k}\le i\lt \dfrac{n}{k-1} kni<k1n因为 i i i 是整数 ⌈ n k ⌉ ≤ i ≤ ⌊ n − 1 k − 1 ⌋ \left\lceil\dfrac{n}{k}\right\rceil\le i\le \left\lfloor\dfrac{n-1}{k-1}\right\rfloor knik1n1根据上面的式子,显然 r = i m a x = ⌊ n − 1 k − 1 ⌋ = ⌊ n − 1 ⌊ n + i − 1 i ⌋ − 1 ⌋ r=i_{max}=\left\lfloor\dfrac{n-1}{k-1}\right\rfloor=\left\lfloor\dfrac{n-1}{\left\lfloor\dfrac{n+i-1}{i}\right\rfloor-1}\right\rfloor r=imax=k1n1= in+i11n1

code:

for(int l=1,r,k;r<=n;l=r+1){
	k=(n+l-1)/l;
	r=(n-1)/(k-1);
	...
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/557166.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

登录解析(前端)

登录代码 1、登录之后做了什么&#xff1f; 执行登陆方法&#xff0c;成功之后&#xff0c;路由跳转到指定路径或者根目录 2、this.$store.dispatch是什么意思&#xff1f; this.$store.dispatch(‘Login’, this.loginForm) 来调取store里的user.js的login方法3、this.$r…

【学习】自动化测试有哪些优势和不足

在当今这个数字化时代&#xff0c;软件测试已经成为了任何一款产品成功的关键因素之一。而在诸多的测试方法中&#xff0c;自动化测试凭借着其独特的魅力吸引着越来越多的企业。今天就让我们一起走进自动化测试的世界&#xff0c;探讨它的优势与不足。 一、自动化测试优势 1.…

强化学习入门之MDP

系列文章目录 第一章 强化学习入门之基本概念 第二章 强化学习入门之MDP 强化学习入门之MDP 系列文章目录前言1. 简介1.1 状态值函数1.2 状态动作值函数1.3 策略 2. 最优策略求解2.1 思想2.2 策略评估2.3 策略改进 3. 最优值函数求解 前言 我们已经知道使用MDP来对强化学习进…

对比实验系列:Efficientdet环境配置及训练个人数据集

一、源码下载 可以通过下方链接下载Efficientdet源码 GitHub - zylo117/Yet-Another-EfficientDet-Pytorch: The pytorch re-implement of the official efficientdet with SOTA performance in real time and pretrained weights.The pytorch re-implement of the official …

检测一切YOLO-World的几个实用使用技巧,助力精准高效目标检测任务!

引言 YOLO-World 是一种最先进的零样本目标检测模型。您可以向 YOLO-World 提供任意文本提示&#xff0c;让模型在没有任何微调的情况下识别图像中的对象实例。没有预定义的类别列表&#xff1b;您需要尝试不同的提示&#xff0c;看看模型是否能够以对您的项目可接受的标准来识…

登录解析(后端)

调试登录接口 进入实现类可以有 验证码校验 登录前置校验 用户验证 验证码校验 通过uuid获取redis 中存储的验证码信息&#xff0c;获取后对用户填写的验证码数据进行校验比对 用户验证 1.进入控制器的 /login 方法 2.进入security账号鉴权功能&#xff0c;经过jar内的流…

element plus el-date-picker type=“datetime“ 限制年月日 时分秒选择

如何限制el-date-picker组件的时分秒选中&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 文档 文档在这里&#xff1a;DateTimePicker 日期时间选择器 | Element Plus 它提供的disabled-date给我们来限制日期选择 nice&#xff01;&…

Linux的图形资源及指令

一、火车 1.切换到超级用户 su 2.下载资源 yum install -y sl 3.输入指令 sl&#xff0c;得到火车图形 如果没有得到该图形&#xff0c;就将2处改为yum install -y epel-release。 二、Linux的logo 1.在超级用户模式下下载资源 yum install -y linux_logo 2.输…

Microchip逆市扩张,接连收购2家公司

尽管年初传来降薪停工的消息&#xff0c;全球领先的半导体解决方案供应商Microchip并未因此停下扩张的脚步。相反&#xff0c;该公司在短短的一个月内&#xff0c;接连宣布收购两家公司&#xff0c;展现了其坚定的市场布局和前瞻的战略眼光。 4月11日&#xff0c;Microchip成功…

【JavaEE初阶系列】——网络原理之进一步了解应用层以及传输层的UDP协议

目录 &#x1f6a9;进一步讲应用层 &#x1f388;自定义应用层协议 &#x1f388;用什么格式组织 &#x1f469;&#x1f3fb;‍&#x1f4bb;xml(远古的数据组织格式) &#x1f469;&#x1f3fb;‍&#x1f4bb;json(当下最流行得一种数据组织格式) &#x1f469;&…

1097 矩阵行平移(语文题,选做)

输入样例&#xff1a; 7 2 99 11 87 23 67 20 75 89 37 94 27 91 63 50 11 44 38 50 26 40 26 24 73 85 63 28 62 18 68 15 83 27 97 88 25 43 23 78 98 20 30 81 99 77 36 48 59 25 34 22 输出样例&#xff1a; 529 481 479 263 417 342 343 样例解读 需要平移的是第 1、…

ZYNQ-Vitis(SDK)裸机开发之(八)PS端QSPI读写flash操作(包括SPI、Dual SPI、Qual SPI的配置使用)

目录 一、Flash知识简介 二、SPI知识简介 1.SPI引脚介绍 2.SPI协议介绍 3.ZYNQ Quad SPI说明 三、Vivado工程搭建 四、编写Vitis程序 1.ZYNQ QSPI Flash操作的格式&#xff1a; 2.头文件&#xff1a;qspi_hdl.h 3.源文件&#xff1a;qspi_hdl.c 4.编写QSPI Flash读写…

已经下载了pytorch,但在正确使用一段时间后出现No module named torch的错误

问题描述 使用的是叫做m2release的虚拟环境&#xff0c;在此环境下使用conda list可以发现是存在pytorch的&#xff0c;但是运行代码时却报No module named torch的错误。 解决方案 想尝试卸掉这个pytorch重新装一次&#xff0c;但是想卸载会提示找不到&#xff0c;想重新…

redis写入和查询

import redis #redis的表名 redis_biao "Ruijieac_sta" #redis连接信息 redis_obj redis.StrictRedis(hostIP地址, port6379, db1, password密码) # keyytressdfg # value22 ##写入 # redis_obj.hset(redis_biao, key, value) #查询 req_redisredis_obj.hget(red…

Python面试十问

深浅拷贝的区别&#xff1f; 浅拷⻉&#xff1a; 拷⻉的是对象的引⽤&#xff0c;如果原对象改变&#xff0c;相应的拷⻉对象也会发⽣改变。 深拷⻉&#xff1a; 拷⻉对象中的每个元素&#xff0c;拷⻉对象和原有对象不在有关系&#xff0c;两个是独⽴的对象。 浅拷⻉(copy)…

selenium_定位tag_name

第一个input """需求&#xff1a;1. 使用tag_name定位方式&#xff0c;使用注册A.html页面&#xff0c;用户名输入admin方法&#xff1a;1. driver.find_element_by_tag_name("") # 定位元素方法2. send_keys() # 输入方法3. driver.quit() # 退出方…

最小生成树算法的实现c++

最小生成树算法的实现c 题目链接&#xff1a;1584. 连接所有点的最小费用 - 力扣&#xff08;LeetCode&#xff09; 主要思路&#xff1a;使用krusal算法&#xff0c;将边的权值进行排序&#xff08;从小到大排序&#xff09;&#xff0c;每次将权值最小且未加入到连通分量中…

6、Lagent AgentLego 智能体应用搭建(homework)

基础作业 完成 Lagent Web Demo 使用&#xff0c;并在作业中上传截图。文档可见 Lagent Web Demo 0 环境准备 conda create -n agent conda activate agent conda install python3.10 conda install pytorch2.1.2 torchvision0.16.2 torchaudio2.1.2 pytorch-cuda11.8 -c py…

【Linux】动态扩容根目录

Linux&#xff1a;解决centos-root 根目录磁盘空间不足&#xff0c;动态扩容&#xff0c;不删数据 默认安装的root分区只有50G&#xff0c;/home分区有大几百G&#xff0c;可以考虑重新挂载分配空间&#xff0c;不用删除数据&#xff0c;不需要停业务。 查看系统空间 df -h解…

【PDF技巧】PDF文件带有密码,该如何解密?

PDF文件带有打开密码、限制编辑&#xff0c;这两种密码设置了之后如何解密&#xff1f; 不管是打开密码或者是限制编辑&#xff0c;在知道密码的情况下&#xff0c;解密PDF密码&#xff0c;我们只需要在PDF编辑器中打开文件 – 属性 – 安全&#xff0c;将权限状态修改为无保护…