首页 > 其他分享 >整除分块

整除分块

时间:2023-05-25 20:34:26浏览次数:26  
标签:lfloor frac 分块 sqrt leq rfloor 整除 therefore

引入

在求解

\[\sum_{i = 1}^{n}\lfloor \frac{n}{i} \rfloor \]

时,我们可以很容易的想到用 \(O(n)\) 求解。

但如果 $n \leq 10^9 $甚至往上的时候,我们这么做就会超时,我们需要一种更高效的方法来计算,整除分块。

原理

比较容易发现,在 \(i\) 取某些值的时候,\(\lfloor \frac{n}{i} \rfloor\) 的值就是相同的,我们就把他们合并起来,找到 \(l\) 和 \(r\) ,一起计算,减少计算次数。

时间复杂度

当 \(i \leq \sqrt n\) 时显然 \(\lfloor \frac{n}{i} \rfloor\) 的取值只有 \(\sqrt n\) 种可能;而当 \(i > \sqrt n\) 时有 \(\frac{n}{i} < \sqrt n\) ,所以 \(\lfloor \frac{n}{i} \rfloor\) 的取值同样只有 \(\sqrt n\) 种可能,也就是说 \(\lfloor \frac{n}{i} \rfloor\) 的取值只有 \(2\sqrt n\) 种可能,对于同样的取值只用计算一次,总的时间复杂度也就是 \(Θ(\sqrt n)\)。

具体实现

首先我们设我们的左端点是 \(l\) ,那么 \(\lfloor \frac{n}{l} \rfloor = k\) ,我们假设右端点 \(r=l+d\) , 使得 \(\lfloor \frac{n}{l} \rfloor = \lfloor \frac{n}{l+d} \rfloor = k\) 。展开得到 \(n = kl+p\) 和 \(n=k(l+d)+p'\) \((1 \leq p < l)\)。

$ \therefore kl+p = k(l+d) + p'$

$ \therefore p'=p-kd$

$ \because p' \ge 0 \ $

$ \therefore p \ge kd$

$ \therefore d \leq \frac{p}{k} $

$ \because d \in N^* \ \ \ $

$ \therefore d \leq \lfloor \frac{p}{k} \rfloor$

$ \because p = n \ mod \ l = n-l\lfloor \frac{n}{l} \rfloor \ \ \ $

$ \therefore r = l + d_{max}$

$ \ \ \ \ \ \ \ = l + \lfloor \frac{p}{k} \rfloor$

$ \ \ \ \ \ \ \ = l + \lfloor \frac{n-l\lfloor \frac{n}{l} \rfloor}{\lfloor \frac{n}{l} \rfloor} \rfloor$

$ \ \ \ \ \ \ \ = l + \lfloor \frac{n}{\lfloor \frac{n}{l} \rfloor} \rfloor - l$

$ \ \ \ \ \ \ \ = \lfloor \frac{n}{\lfloor \frac{n}{l} \rfloor} \rfloor$

\(QED\)

所以说,对于每一个左端点为 \(l\) 的块,他的右端点就是 $ \lfloor \frac{n}{\lfloor \frac{n}{l} \rfloor} \rfloor$ 。

所以,当我们求

\[\sum_{i = 1}^{n}\lfloor \frac{n}{i} \rfloor \]

的时候,\(l\) 从 \(1\) 开始枚举,每次右端点 \(r\) 取
$ min(n,\lfloor \frac{n}{\lfloor \frac{n}{l} \rfloor} \rfloor)$ ,将整块答案累加,然后令 \(l=r+1\),直到等于 \(n\) 的时候停止。

练习

\(P3935\) \(P2261\)

标签:lfloor,frac,分块,sqrt,leq,rfloor,整除,therefore
From: https://www.cnblogs.com/bloodstalk/p/17432777.html

相关文章

  • *【学习笔记】(9) 分块
    分块思想引用一下oi-wiki的话:分块的基本思想是:通过对原数据的适当划分,并在划分后的每一个块上预处理部分信息,从而较一般的暴力算法取得更优的时间复杂度。数列/序列分块引入#6280.数列分块入门4给定一长度为$n$的数列,有\(n\)次操作。操作分为两种:区间加,查询区间......
  • Luogu P2801 教主的魔法(Loj 数列分块入门 2)
    教主的魔法题目描述教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给XMYZ信息组每个英雄看。于是\(N\)个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为\(1,2,\ldots,N\)。每个人的身高一开始都是不超过\(1000\)的正整数。教主的魔法每次可以把闭......
  • 数论分块
    数论分块数论分块就是一个小结论对于一个常数n,和一个给定的数i(\(i<n\)),能使\[\lfloor{\frac{n}{i}}\rfloor=\lfloor{\frac{n}{j}}\rfloor\]的最大整数j(\(i\lej\len\))为\(\lfloor{\frac{n}{\lfloor{\frac{n}{i}}\rfloor}}\rfloor{}\)证明:设\(\lfloor{\frac{n}{i}}\rflo......
  • 蒲公英(Loj 分块模板9)
    [Violet]蒲公英题目背景亲爱的哥哥:你在那个城市里面过得好吗?我在家里面最近很开心呢。昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被它杀掉了。我觉得把那么可怕的怪物召唤出来的那个坏蛋也很坏呢。不过奶奶说他是很难受......
  • Loj分块模板1
    #include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>usingnamespacestd;intn,m,len;intpos[5211314],add[5211314],num[5211314];inlinevoidAdd(intLiftPos,intRightPos,intval......
  • 2023-05-17:一个正整数如果能被 a 或 b 整除,那么它是神奇的。 给定三个整数 n , a , b
    2023-05-17:一个正整数如果能被a或b整除,那么它是神奇的。给定三个整数n,a,b,返回第n个神奇的数字。因为答案可能很大,所以返回答案对10^9+7取模后的值。输入:n=4,a=2,b=3。输出:6。答案2023-05-17:过程描述:1.计算a和b的最小公倍数lcm。2.初始化......
  • Codeforces 1423C - Dušan's Railway(树分块)
    首先\(k>3\)当\(k=3\)做,也就是说题目等价于找不超过\(10n\)条路径使得任意两点间的路径都可以表示为选定的这些路径中不相交的三者的并。先考虑链怎么做,关于这个\(3\),很自然的想法是取若干关键点,关键点之间两两连边,其余点再像相邻两关键点连边,因此考虑分块,每\(B\)个点设......
  • 松下FP XH六轴标准程序,程序控制六个伺服,轴的点动控制,回零,相对定位,绝对定位,程序结构清
    松下FPXH六轴标准程序,程序控制六个伺服,轴的点动控制,回零,相对定位,绝对定位,程序结构清晰,分块编程通俗易懂,注释完整,程序是成熟的项目程序,多工位转盘循环控制,是转盘控制的经典作品ID:8119668632759622......
  • 1015.可被K整除的最小整数--中等
    题目描述给定正整数k ,你需要找出可以被k 整除的、仅包含数字1的最小正整数n 的长度。返回n 的长度。如果不存在这样的n ,就返回-1。注意:n 不符合64位带符号整数。示例1:输入:k=1输出:1解释:最小的答案是n=1,其长度为1。示例2:输入:k=2输出:-1解释:不存在......
  • Codeforces 543E - Listening to Music(分块)
    根号log做法。能过CF的数据,但过不了校内模拟赛的数据/tuu考虑从\(f(i,x)\)到\(f(i+1,x)\)的变化在哪里:少了个\(a_i\)多了个\(a_{i+m}\),因此显然只有\(x\)在它俩中间才有\(f(i,x)\nef(i+1,x)\),即:\[f(i+1,x)-f(i,x)=\begin{cases}-1&(a_i<x\lea_{i+m})\\1&(a_{i+m......