首页 > 其他分享 >数论分块

数论分块

时间:2023-01-08 18:11:06浏览次数:53  
标签:lfloor right 分块 数论 dfrac rfloor big left

数论分块

数论分块可以快速计算一些含有除法向下取整的和式 (即形如 \(\sum_{i=1}^{n} f(i) g\left(\left\lfloor\dfrac{n}{i}\right\rfloor\right)\) 的和式)。当可 以在 \(O(1)\) 内计算 \(f(r)-f(l)\) 或已经预处理出 \(f\) 的前缀和时,数论分块就可以在 \(O(\sqrt{n})\) 的时间内 计算上述和式的值。
它主要利用了富比尼定理 (\(Fubini's theorem\)),将 \(\big\lfloor\dfrac{n}{i}\big\rfloor\) 相同的数打包同时计算。

引入

洛谷 P1403 约数研究

题目转换一下就是求 \(f(n)=\sum_{i=1}^{n}\big\lfloor\dfrac{n}{i}\big\rfloor\)

朴素做法,遍历 \(1\sim n\) 求和,时间复杂度 \(O(n)\)

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int ans = 0;
        for (int i = 1; i <= n; ++i) {
            ans += n / i;
        }
        System.out.println(ans);
    }
}

不能解决 \(10^9\) 以上的数据范围,考虑优化

当 \(n=21\) 时,\(\big\lfloor\dfrac{n}{i}\big\rfloor\) 的值如下:

\(i\) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
\(\big\lfloor\dfrac{n}{i}\big\rfloor\) 21 10 7 5 4 3 3 2 2 2 1 1 1 1 1 1 1 1 1 1 1

观察发现,\(\big\lfloor\dfrac{n}{i}\big\rfloor\) 的取值在连续的一段区间内是相同的,是”一块一块“的

如果我们知道了每一块的值和长度(左右边界),也就可以使用乘法运算来代替加法运算了

求某一值所在块的右端点

假设求 \(i\) 所在块的右端点

\(i\) 所在块的值为 \(k=\big\lfloor\dfrac{n}{i}\big\rfloor\),则 \(k\leqslant\dfrac{n}{i}\),所以 \(\big\lfloor\dfrac{n}{k}\big\rfloor\geqslant\left\lfloor\dfrac{n}{\frac{n}{i}}\right\rfloor=\big\lfloor i\big\rfloor=i\)

因此,\(i_{\max }=\left\lfloor\dfrac{n}{k}\right\rfloor=\left\lfloor\dfrac{n}{\left\lfloor\dfrac{n}{i}\right\rfloor}\right\rfloor\),即右端点为 \(\left\lfloor\dfrac{n}{\left\lfloor\dfrac{n}{i}\right\rfloor}\right\rfloor\)

实现

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long n = sc.nextLong();
        long ans = 0;
        for (long l = 1, r; l <= n; l = r + 1) {
            r = n / (n / l);
            ans += n / l * (r - l + 1);
        }
        System.out.println(ans);
    }
}

时间复杂度分析

\(\text{ 分块的块数 }\leq 2\left\lfloor\sqrt{n}\right\rfloor\)

证明:

当 \(i \leq\lfloor\sqrt{n}\rfloor\) 时, \(\left\lfloor\dfrac{n}{i}\right\rfloor\) 有 \(\lfloor\sqrt{n}\rfloor\) 种取值。
当 \(i>\lfloor\sqrt{n}\rfloor\) 时, \(\left\lfloor\dfrac{n}{i}\right\rfloor \leq\lfloor\sqrt{n}\rfloor,\left\lfloor\dfrac{n}{i}\right\rfloor\) 至多有 \(\lfloor\sqrt{n}\rfloor\) 种取值。

综上,分块的块数\(\leq 2\left\lfloor\sqrt{n}\right\rfloor\)

因此,时间复杂度为 \(O(2\sqrt n)=O(\sqrt n)\)

例题

参考资料

【数论】整除分块(数论分块)_辞树c的博客-CSDN博客

549 整除分块(数论分块)- 董晓算法 - 哔哩哔哩

数论分块 - OI Wiki

标签:lfloor,right,分块,数论,dfrac,rfloor,big,left
From: https://www.cnblogs.com/Cattle-Horse/p/17035026.html

相关文章

  • 【学习笔记 / 长期更新】OI 中的数论
    -Preface0.1前言本文意为作者从\(0\)开始学习数论,同时也对OIWiki的某些内容做补充说明。如果你看到有一些小标题没有内容,很正常,作者\(\color{white}\small\textb......
  • 寒假集训——基础数论
    开篇\(————\sum\)的本质\(\sum\)其实可以理解为for循环例如$$\sum_{i=1}^{n}i$$其实就是代码中intans=0;for(inti=1;i<=n;i++)ans+=a[i];ans的值求......
  • 数论
    积性函数筛法莫比乌斯反演整除与同余基础同余进阶BSGS......
  • LOJ 数列分块入门 9 题解题报告
    LOJ数列分块入门9题解题报告\(\text{ByDaiRuiChen007}\)I.数列分块入门1题目大意\(\text{Link}\)维护一个长度为\(n\)的序列,支持区间加,单点查值思路分析简......
  • 洛谷P8567 真·基础数论问题
    基础数论重定向今天蒟蒻切水题切到一道建议评黄的红题,一下子给我整不会了……题目传送门理解题意首先,我们要理解题意。[JRKSJR6]Nothing我们定义\(f(x)\)表示\(......
  • 「学习笔记」分块
    树状数组、线段树、ST表……这些数据结构我们用的也不算少了,但实际上这些数据结构还不够灵活,面对一些区间问题时反而会出问题。举个栗子:现在有\(n\)个单调队列需要维......
  • 《初等数论及其应用》阅读笔记
    Chapter1整数良序性质(TheWell-OrderingProperty):每个非空的正整数集合都有一个最小元。定义如果存在整数\(p\)和\(q\ne0\),使得\(r=p/q\),则称实数\(r\)是有理......
  • Even Subarrays(数论问题)
    题目链接题目描述:Youaregivenanintegerarray\(a_1,a_2,…,a_n(1≤a_i≤n).\)FindthenumberofsubarraysofawhoseXORhasanevennumberofdivisors.In......
  • Algorithm 2 - 一些数论/组合计数知识
    0.一些前置知识莫比乌斯函数:定义\(\mu(x)\)为:当\(x\)含平方因子,则\(\mu(x)=0\);否则设其有\(p\)个质因子,\(\mu(x)=(-1)^p\)。特别的,\(\mu(1)=1\)。莫比乌斯......
  • 序列分块入门
    本文不涉及Ynoi大分块。分块简介对于一道数据结构题,如果常规思路(如线段树、BIT、ST表、主席树、平衡树、树套树、K-DTree等)不好做,我们可以考虑将序列分成\(B\)块,......