Loading [MathJax]/jax/element/mml/optable/BasicLatin.js

「学习笔记」数论分块

引入#

给定 n1010,求 ni=1ni
我们可以想到枚举,但是 n1010,你 T 飞了
怎么办呢?
我们先举几个小的例子,例如 n10

i 1 2 3 4 5 6 7 8 9 10
ni 10 5 5 2 2 1 1 1 1 1

相信看到这,你就发现了,这一整个数列被分成了若干段,每段的长度以及所代表的答案都不同,但是我们可以直接算出来,ni 是这个答案所代表的值,nni 是这个答案的块的右端点,[l,r]=[l,nni]
下面是一些结论与推导
结论:ni 最多有 2n 种不同的值
证明:
1、当 1inin 种,所以 ni 最多n 种不同的值
2、当 i>n1ninni 也最多有 n 种不同的值
所以加起来,ni 最多有 2n 种不同的值
ni 最多有 2n 种不同的值,我们只需要找到每种值有多少个即可,就能在 On 的时间复杂度内算出 ni=1ni 的值
每种值的个数有多少个呢?
假设 ni=k,找出了多少个 i,使得 ni=k
ns=kns=ks 是满足 ni=k 的最小值,s 是满足 ni=k 的最大值
s=s+d,所以 ns=ns+d=k
n=k×s+p=k×(s+d)+p(0p<s,0p<s+d)
k×s+p=k×(s+d)+p
k×d=pp
所以 dmax
所以 s' = s + d_{\max}

\begin{aligned} s' & = s + d_{\max}\\ & = s + \lfloor \frac{p}{k} \rfloor\\ & = s + \lfloor \frac{n \% s}{\lfloor \frac{n}{s} \rfloor} \rfloor\\ & = s + \lfloor \frac{n - \lfloor \frac{n}{s} \rfloor s}{\lfloor \frac{n}{s} \rfloor} \rfloor\\ & = s + \lfloor \frac{n}{\lfloor \frac{n}{s} \rfloor} - s \rfloor\\ & = s + \lfloor \frac{n}{\lfloor \frac{n}{s} \rfloor} \rfloor - s\\ & = \lfloor \frac{n}{\lfloor \frac{n}{s} \rfloor} \rfloor \end{aligned}

所以 s' = \lfloor \frac{n}{\lfloor \frac{n}{s} \rfloor} \rfloor
有多少个数呢?
s' - s
End.

作者:yifan0305

出处:https://www.cnblogs.com/yifan0305/p/17045021.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

转载时还请标明出处哟!

posted @   yi_fan0305  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(一):从.NET IoT入
· .NET 开发的分流抢票软件,不做广告、不收集隐私
· ASP.NET Core - 日志记录系统(二)
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· 实现windows下简单的自动化窗口管理
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示