1.概念

从一道例题说起

在介绍整除分块之前,我们先来看一道算数题:已知正整数n,求∑i=1n⌊ni⌋已知正整数n,求∑i=1n⌊ni⌋在介绍整除分块之前,我们先来看一道算数题:
已知正整数n,求∑i=1n⌊ni⌋\begin{aligned}已知正整数n,求\sum_{i=1}^n \left⌊\dfrac{n}{i}\right⌋\end{aligned}在介绍整除分块之前,我们先来看一道算数题:已知正整数n,求∑i=1n⌊ni⌋已知正整数n,求i=1∑n​⌊in​⌋​

我们写一个表格看一看1-20的整除是什么样子的

i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
⌊20i⌋\left⌊\dfrac{20}{i} \right⌋⌊i20​⌋ 20 10 6 5 4 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1

表中同样的值会连续出现,而相同的值所划分的区间积是整出分块。整除的性质使得从1到n的数组表可根据数值划分为不同的分块,且分块数远远小于n。利用这种性质,我们如果能推导出每个分块具体的左右端点位置在哪,这个问题就可以快速求解出来了。

2.整除分块公式推导

向下取整的情形

还是说我们的例题

已知正整数n,求∑i=1n⌊ni⌋已知正整数n,求\sum_{i=1}^n \left⌊\dfrac{n}{i}\right⌋已知正整数n,求∑i=1n​⌊in​⌋

 假设我们已知某一个分块的左端点lll,要求解出该分块的右端点rrr。设该分块的数值为kkk,对于该分块中的每个数iii,有k=⌊ni⌋=⌊nl⌋k=\left⌊\dfrac{n}{i}\right⌋=\left⌊\dfrac{n}{l}\right⌋k=⌊in​⌋=⌊ln​⌋,即ik≤nik\le nik≤n,也就是说我们找到可得使ik≤nik\le nik≤n成立的最大的i的值即是我们所求的右端点r,因此我们可以得到下列式子:

{k=⌊nl⌋ r=max⁡(i),ik≤n\begin{cases}k = \left⌊\dfrac{n}{l}\right⌋ \\\space \\r = \max (i), ik \le n\end{cases}⎩⎪⎪⎨⎪⎪⎧​k=⌊ln​⌋ r=max(i),ik≤n​

推导可得:

r=⌊nk⌋=⌊n⌊nl⌋⌋r= \left⌊\dfrac{n}{k}\right⌋=\left⌊\dfrac{n}{\left⌊\dfrac{n}{l}\right⌋ }\right⌋r=⌊kn​⌋=⎣⎢⎢⎢​⌊ln​⌋n​⎦⎥⎥⎥​

容易得到代码:

ans = 0;
for(int l = 1, r; l <= n; l = r + 1)
{
r = n / (n / l);
ans += n / l * (r - l + 1);
}

But 还没有结束

我们再看这一道题:

已知正整数n,a,b,求∑i=1n⌊nai+b⌋\begin{aligned}已知正整数n, a, b, 求\sum_{i=1}^n \left⌊\dfrac{n}{ai + b} \right⌋\end{aligned}已知正整数n,a,b,求i=1∑n​⌊ai+bn​⌋​

抓瞎了,但是变变形应该可以做。

我们记得

{k=⌊nl⌋ r=max⁡(i),ik≤n\begin{cases}k = \left⌊\dfrac{n}{l}\right⌋ \\\space \\r = \max (i), ik \le n\end{cases}⎩⎪⎪⎨⎪⎪⎧​k=⌊ln​⌋ r=max(i),ik≤n​

r=⌊nk⌋=⌊n⌊nl⌋⌋r= \left⌊\dfrac{n}{k}\right⌋=\left⌊\dfrac{n}{\left⌊\dfrac{n}{l}\right⌋ }\right⌋r=⌊kn​⌋=⎣⎢⎢⎢​⌊ln​⌋n​⎦⎥⎥⎥​

以上两个公式,我们有如下

{k=⌊nal+b⌋ r=max⁡(i),(ai+b)k≤n\begin{cases}k = \left⌊\dfrac{n}{al+b}\right⌋ \\\space \\r = \max (i), (ai+b)k \le n\end{cases}⎩⎪⎪⎨⎪⎪⎧​k=⌊al+bn​⌋ r=max(i),(ai+b)k≤n​

上式子可推导为



但是对于这个题目,我们给出第二种推导方式,使得一种推导方式解决多种题目。



这我们再做

已知正整数n,求∑i=1n⌊ni2⌋\begin{aligned}已知正整数n, 求\sum_{i=1}^n \left⌊\dfrac{n}{i^2} \right⌋\end{aligned}已知正整数n,求i=1∑n​⌊i2n​⌋​

我们按照上面的方式推导



不知道这时候有多少人偷笑,说自己把整除分块学会了,曾经以为自己是个王者,结果他爸来。



这个题你懵了吗,对于一对 L和R,中间的值是等差数列,相差1,归根结底还是整除分块,还是找到l和r,通过等差数列计算即可。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n, k, ans = 0;
long long left = 1, right, rest;
scanf("%lld%lld", &n, &k);
while (left <= n && left <= k) //求从1到min(n, k)内的总和
{
right = min(k / (k / left), n);
rest = k % left;
ans += (rest + rest - (right - left) * (k / left)) * (right - left + 1) / 2;
left = right + 1;
}
if (n > k)
{
ans += k * (n - k);
}
cout << ans;
}



王者你会了吗?

王者自信满满的说自己会了!

王者再看看这个题

已知正整数n,求∑i=1n⌈ni⌉已知正整数n,求\sum_{i=1}^n \left⌈\dfrac{n}{i}\right⌉已知正整数n,求∑i=1n​⌈in​⌉

没4没4,我们就不推导向上取整了,这里只需要一个小转化,将向上取整转化为向下取整。

我们考虑没有整除的时候是不是就有

⌈ni⌉=⌊ni⌋+1\left⌈\dfrac{n}{i}\right⌉ =\left⌊\dfrac{n}{i}\right⌋+1⌈in​⌉=⌊in​⌋+1 如果整除的时候就相等了,那么我们只要不加1,我们加上i−1i\dfrac{i-1}{i}ii−1​就可以避免这种情况,那么就可以转化为



通过上面向下取整的推到即可得到



到这里王者就可以独当一面了。

数学--数论--整除分块(巨TM详细,学不会,你来打我)的更多相关文章

  1. CodeForces 1202F(数论,整除分块)

    题目 CodeForces 1213G 做法 假设有\(P\)个完整的循环块,假设此时答案为\(K\)(实际答案可能有多种),即每块完整块长度为\(K\),则\(P=\left \lfloor \fr ...

  2. [POI2007]ZAP-Queries (莫比乌斯反演+整除分块)

    [POI2007]ZAP-Queries \(solution:\) 唉,数论实在有点烂了,昨天还会的,今天就不会了,周末刚证明的,今天全忘了,还不如早点写好题解. 这题首先我们可以列出来答案就是: ...

  3. [笔记] 整除分块 & 异或性质

    整除分块 参考资料:整除分块_peng-ym OI生涯中的各种数论算法的证明 公式 求:\(\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor\) 对于每个\(\lfloo ...

  4. P2261 [CQOI2007]余数求和[整除分块]

    题目大意 给出正整数 n 和 k 计算 \(G(n, k)=k\ \bmod\ 1 + k\ \bmod\ 2 + k\ \bmod\ 3 + \cdots + k\ \bmod\ n\) 的值 其中 ...

  5. luogu2261余数求和题解--整除分块

    题目链接 https://www.luogu.org/problemnew/show/P2261 分析 显然\(k\) \(mod\) \(i=k-\lfloor {k/i}\rfloor\) \(\ ...

  6. 51Nod 1225 余数之和 [整除分块]

    1225 余数之和 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 F(n) = (n % 1) + (n % 2) + (n % 3) + ... ...

  7. [Bzoj 2956] 模积和 (整除分块)

    整除分块 一般形式:\(\sum_{i = 1}^n \lfloor \frac{n}{i} \rfloor * f(i)\). 需要一种高效求得函数 \(f(i)\) 的前缀和的方法,比如等差等比数 ...

  8. P2568 莫比乌斯反演+整除分块

    #include<bits/stdc++.h> #define LL long long using namespace std; ; bool vis[maxn]; int prime[ ...

  9. LOJ #2802. 「CCC 2018」平衡树(整除分块 + dp)

    题面 LOJ #2802. 「CCC 2018」平衡树 题面有点难看...请认真阅读理解题意. 转化后就是,给你一个数 \(N\) ,每次选择一个 \(k \in [2, N]\) 将 \(N\) 变 ...

随机推荐

  1. django自定义404和500页面

    from django.contrib import admin from django.urls import path urlpatterns = [ path('admin/', admin.s ...

  2. Linux下修改efi启动项

    Linux下有一个efibootmgr工具可以编辑efi启动项,十分方便,简单介绍如下 直接运行efibootmgr会显示出当前所有efi启动项,每个启动项前都有相应编号, 可以使用efibootmg ...

  3. 微信小程序(黑马优购)完成!!{10天}

    微信小程序(黑马优购)完成!!{10天} 项目技术点: wxml, json, wxss, js, mina框架 附上视频链接添加链接描述

  4. tf.nn.relu6 激活函数

    tf.nn.relu6(features,name=None) 计算校正线性6:min(max(features, 0), 6) 参数: features:一个Tensor,类型为float,doub ...

  5. Unity 随机地图房间通道生成

    之前的博客中已经说了随机房间生成: https://www.cnblogs.com/koshio0219/p/12604383.html 但实现房间生成只是整个地图生成最初最简单的一步.下面讨论如何随 ...

  6. 1327C - Game with Chips (构造)

    题目大意:一个n*m的棋盘上有k个棋子,k个棋子相互关联,可以一起向上向下向左向右,当碰到边界时,如果继续移动会发生越界,那么该棋子会保持不动,其余棋子继续移动.问能否在2*n*m的移动次数内,使各个 ...

  7. Matlab学习-(1)

    1. 认识Matlab (1)MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发.数据可视化.数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simul ...

  8. [V&N2020 公开赛]TimeTravel 复现

    大佬友链(狗头):https://www.cnblogs.com/p201821440039/ 参考博客: https://www.zhaoj.in/read-6407.html https://cj ...

  9. SpringMVC视图解析中的 forward: 与 redirect: 前缀

    在 SpringMVC 中,可以指定画面的跳转方式.使用 forward: 前缀实现请求转发跳转,使用 redirect: 前缀实现重定向跳转.有前缀的转发和重定向操作和配置的视图解析器没有关系,视图 ...

  10. 新建Django项目示例--图书管理系统

    知识点: Django 1. 安装 1. Django版本 1.11.xx 2. 安装方式 1. 命令行 --> Python环境(双版本,pip的使用) 2. PyCharm安装 2. 创建D ...