整除分块

\(\sum_{i=1}^N \lfloor \frac Ni \rfloor\)\(N \leq 10^{12}\)

显然不能直接做,

数论性质:

$ 1. \large \lfloor \frac Ni \rfloor$最多只有\(2\sqrt{N}\)种取值

证明:对于\(i\le \sqrt{N},\) 只有 \(\sqrt{N}\) 种,对于 \(i>\sqrt{N},\large{\frac Ni}<\sqrt{N}\),也只有 \(\sqrt{N}\) 种取值,共计 \(2 \sqrt{N}\)\(\;\;\Box\)

\(2.\) 设 $\large \lfloor \frac N{i'} \rfloor $ 与 \(\large \lfloor \frac Ni \rfloor\) 相等,则 \(i'\) 的最大值为 $\large \left \lfloor \frac N{\left \lfloor \frac Ni \right \rfloor } \right \rfloor $

证明:

\(\large{ \lfloor \frac Ni \rfloor}=k\) ,于是可以写成 \(ki+p=N,1\le p<i\) 的形式,若 \(\large{\lfloor \frac N{i+d} \rfloor}=k\) ,于是有 \(k(i+d)+p'=N\) ,可以得到 \(p'=p-kd\) ,则 \(d\) 能取的最大值为 \(\large \lfloor \frac pk \rfloor\) ,于是 :

\[\begin{aligned}i'&=i+d_{max} \\ &=i+\lfloor \frac pk \rfloor \\&=i+\left \lfloor \frac {N \;mod\; i}{\lfloor \frac Ni \rfloor} \right \rfloor \\ &=i+\left \lfloor \frac {N-\lfloor \frac Ni\rfloor i}{\lfloor \frac Ni \rfloor} \right \rfloor \\ &=\left \lfloor i + \frac {N-\lfloor \frac Ni\rfloor i}{\lfloor \frac Ni \rfloor} \right \rfloor \\ &=\left \lfloor \frac{\lfloor \frac Ni \rfloor i}{\lfloor \frac Ni \rfloor} + \frac {N-\lfloor \frac Ni\rfloor i}{\lfloor \frac Ni \rfloor} \right \rfloor \\ &=\left \lfloor \frac N{\lfloor \frac Ni \rfloor} \right \rfloor \quad \quad\Box\end{aligned}\]

然后,设两个指针 \(L\)\(R\)\(L\) 的初始值为 \(1\) ,每次令 \(\large R=\left \lfloor \frac N{\lfloor \frac NL \rfloor} \right \rfloor\) ,将 \(\large (R-L+1)\cdot \lfloor \frac NL \rfloor\) 累加至答案中 ,再令 \(L=R+1\)

由于 \(\large \lfloor \frac NL \rfloor\) 只有 \(2\sqrt N\) 种取值 ,且单调递减,则最多只有 \(2\sqrt N\) 个取值不同的段,时间复杂度为 \(O(\sqrt N)\)

 

模板:

 1 int main()
 2 {
 3     ll ans=0,n;
 4     scanf("%lld",&n);
 5     for(int l=1,r;l<=n;l=r+1){
 6         r=n/(n/l);
 7         ans += (r-l+1)*(n/l);
 8     }
 9     printf("%lld\n",ans);
10     return 0;
11 }

 

拓:\(\forall a,b,c\in Z\),\(\left \lfloor \frac{a}{bc}\right \rfloor = \left \lfloor \frac{\left \lfloor \frac{a}{b}\right \rfloor}{c}\right \rfloor\)

\(\sum_{i=1}^{n}\frac{\left ( 1+\left \lfloor \frac{n}{i}\right \rfloor\right )*\left \lfloor \frac{n}{i}\right \rfloor}{2}=\sum_{i=1}^{n}i*\left \lfloor \frac{n}{i}\right \rfloor\)

学习博客:https://www.cnblogs.com/0xfffe/p/9648943.html

posted @ 2020-02-24 20:24  swsyya  阅读(134)  评论(0编辑  收藏  举报

回到顶部