「学习笔记」数论分块
引入#
给定 n≤1010,求 ∑ni=1⌊ni⌋
我们可以想到枚举,但是 n≤1010,你 T 飞了
怎么办呢?
我们先举几个小的例子,例如 n≤10
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
⌊ni⌋ | 10 | 5 | 5 | 2 | 2 | 1 | 1 | 1 | 1 | 1 |
相信看到这,你就发现了,这一整个数列被分成了若干段,每段的长度以及所代表的答案都不同,但是我们可以直接算出来,⌊ni⌋ 是这个答案所代表的值,⌊n⌊ni⌋⌋ 是这个答案的块的右端点,[l,r]=[l,⌊n⌊ni⌋⌋]
下面是一些结论与推导
结论:⌊ni⌋ 最多有 2√n 种不同的值
证明:
1、当 1≤i≤√n,i 有 √n 种,所以 ⌊ni⌋ 最多有 √n 种不同的值
2、当 i>√n,1≤⌊ni⌋≤√n,⌊ni⌋ 也最多有 √n 种不同的值
所以加起来,⌊ni⌋ 最多有 2√n 种不同的值
⌊ni⌋ 最多有 2√n 种不同的值,我们只需要找到每种值有多少个即可,就能在 O√n 的时间复杂度内算出 ∑ni=1⌊ni⌋ 的值
每种值的个数有多少个呢?
假设 ⌊ni⌋=k,找出了多少个 i,使得 ⌊ni⌋=k
设 ⌊ns⌋=k,⌊ns′⌋=k,s 是满足 ⌊ni⌋=k 的最小值,s′ 是满足 ⌊ni⌋=k 的最大值
令 s′=s+d,所以 ⌊ns⌋=⌊ns+d⌋=k
n=k×s+p=k×(s+d)+p′(0≤p<s,0≤p′<s+d)
k×s+p=k×(s+d)+p′
k×d=p−p′
所以 dmax
所以 s' = s + d_{\max}
所以 s' = \lfloor \frac{n}{\lfloor \frac{n}{s} \rfloor} \rfloor
有多少个数呢?
s' - s 个
End.
作者:yifan0305
出处:https://www.cnblogs.com/yifan0305/p/17045021.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
转载时还请标明出处哟!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(一):从.NET IoT入
· .NET 开发的分流抢票软件,不做广告、不收集隐私
· ASP.NET Core - 日志记录系统(二)
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· 实现windows下简单的自动化窗口管理