当前位置: 首页 > news >正文

【学术】数论分块保姆级教程

提示:本篇文章只讲数论分块(也叫整除分块)的基本形式,感兴趣可以自行查阅资料。

几个定义

  • 分块:
    顾名思义,就是把一个区间分成几小块,然后对于每个块进行单独的处理。它的核心思想是将一个大规模的输入划分成更小的“块”,然后针对每一块单独处理。(只需要了解就行)
  • {\left\lfloor\dfrac{}{}\right\rfloor} 符号,作用是向下取整,如 \(\dfrac{13}{5}=2.6\),则 \(\left\lfloor\dfrac{13}{5}\right\rfloor=2\)

推销一波我的洛谷号

考虑这道题:

给出 \(n\), \(k\), 求: \(\displaystyle f(n,k)=\sum_{i=1}^nk\%i\)

首先把%去掉

\[\begin{align} \displaystyle f(n,k)&=\sum_{i=1}^nk\%i\\&=\sum_{i=1}^nk-i\left\lfloor\dfrac{n}{i}\right\rfloor\\&=nk-\sum_{i=1}^ni\left\lfloor\dfrac{n}{i}\right\rfloor\\ \end{align} \]

那么关键就是求出:\(\sum_{i=1}^ni\left\lfloor\dfrac{n}{i}\right\rfloor\),这就是数论分块的功能了。

注意到\(\left\lfloor\dfrac{n}{i}\right\rfloor\)其实是有很多是相同的,比如当n=9时

\(i\) \(1\) \(2\) \(3\) \(4\) \(5\) \(6\) \(7\) \(8\) \(9\)
\(\left\lfloor\dfrac{n}{i}\right\rfloor\) \(9\) \(4\) \(3\) \(2\) \(1\) \(1\) \(1\) \(1\) \(1\)

那么我们完全可以将\(\left\lfloor\dfrac{n}{i}\right\rfloor\)的数一起计算,这种思想利用了分块思想,也是数论分块名字的由来。

那么如何计算每个块?也就是问对于固定数 \(l\),且 \(\left\lfloor\dfrac{n}{l}\right\rfloor=\left\lfloor\dfrac{n}{r}\right\rfloor\),求 \(max(r)\)

先给结论:\(max(r)=\left\lfloor\dfrac{n}{\left\lfloor\dfrac{n}{l}\right\rfloor}\right\rfloor\)

证明:

\(k=\left\lfloor\dfrac{n}{l}\right\rfloor\)

则由向下取整的定义:\(k\le\dfrac{n}{l}\lt k+1\)

取倒数得: \(\dfrac{n}{k}\geq l>\dfrac{n}{k+1}\)

所以 \(l\) 的最大值为 \(\dfrac{n}{k}\),即\(\left\lfloor\dfrac{n}{\left\lfloor\dfrac{n}{l}\right\rfloor}\right\rfloor\)

所以可以从上一块末尾编号+1作为当前块的起点,再用以上结论求出末尾,用等差数列公式一次计算整个块之和。

洛谷P2261

#include<bits/stdc++.h>
using namespace std;
long long n,k,ans;
void solve()
{ans=n*k;int l=1,r;for(;l<=n;l=r+1){if(k/l) r=min(k/(k/l),n);else r=n;ans-=(k/l)*(r-l+1)*(l+r)>>1;}
}
int main()
{while(cin>>n>>k)solve(),cout<<ans<<'\n';return 0;
}

时间复杂度分析:\(\mathcal{O(\sqrt{n})}\)
未完待续...

http://www.jsqmd.com/news/33495/

相关文章:

  • 基础架构
  • 2025数据库审计产品选型指南:十大厂商综合评测与趋势解析
  • Word表格1.5倍行距居中问题
  • 详细介绍:后端_Redis 分布式锁实现指南
  • 构建AI智能体:五十七、LangGraph + Gradio:构建可视化AI工作流的趣味指南 - 教程
  • 日总结 23
  • 详细介绍:基于Echarts+HTML5可视化数据大屏展示-车辆综合管控平台
  • 基于ollama和streamlit的聊天机器人
  • CSP-S 2025 T2 [道路建设]
  • 使用Git钩子+ husky + lint语法检查提高前端项目代码质量
  • [题解]P10277 [USACO24OPEN] Bessies Interview S
  • 关于 Java快速查找详细
  • 什么是Ansible 清单 - 详解
  • 完整教程:如何用开源软件
  • 第一次团队项目作业
  • 隨機變量本質之最終闡述
  • 足式机器人适应多地形的方案
  • 使用vLLM实测3090和4090的大模型推理性能
  • CF1700F Puzzle
  • Redis高可用与高并发探险之旅:从单机到集群的完美进化【第三部分】
  • UE:论运行时动画录制的关键-正确获取骨骼数据与保存
  • 线性基相关
  • 关于fcitx5预览窗口部分emoji乱码问题
  • a-menu 当设置折叠状态如何穿透悬浮菜单样式
  • attention论文及Transformer工作原理概述
  • kamailio+rtpengine对sdp的处理
  • 软工团队项目第一次作业
  • 低代码权限管理安全合规指南:守住数据安全的 “最后一道防线”
  • 2025-11-06
  • 低代码权限管理常见场景解决方案:精准适配不同业务需求