浅谈整除分块

科技资讯 投稿 5100 0 评论

浅谈整除分块

例题一

\[\sum_{i=1}^n \lfloor\frac n i\rfloor\\ \]

注意到函数\(y=\lfloor\dfrac n x\rfloor\的图像如下:

这启发我们根据\(y\值,把\(x\分组,每组“打包”算好。

虽然图像上看\(y\的数量很大,但是考虑到许多\(y\不包含整数的\(x\,因此时间复杂度就是这样的了。

for(LL l=1,r;l<=n;l=r+1
{
   r=n/(n/l;
   ans+=(n/l*(r-l+1;
}

例题二

\[\sum_{i=1}^nk\bmod i\\ \]

对原式进行推导:

\[\sum_{i=1}^nk\bmod i\\ =\sum_{i=1}^nk-i\lfloor\frac k i\rfloor\\ =nk-\sum_{i=1}^ni\lfloor\frac k i\rfloor\\ \]

代码实现如下:

ans=n*k;
for(LL l=1,r;l<=n&&l<=k;l=r+1
{
    r=min(k/(k/l,n;
    ans-=(k/l*(r+l*(r-l+1/2;
}

例题三

函数 \(f(i\ 表示 \(i\ 所有约数的和。

考虑前缀和作差,问题变成\([1,R]-[1,L-1]\。

例题四

\[\sum_{i=1}^n\sum_{j=1}^m (n\bmod i(m\bmod j\\ \]

这道题显然也是推导。

\[\sum_{i=1}^n\sum_{j=1}^m (n\bmod i(m\bmod i\\ =\sum_{i=1}^n(n\bmod i\sum_{j=1}^m (m\bmod j\\ =\sum_{i=1}^n(n-i\lfloor\frac n i\rfloor\sum_{j=1}^m (m-j\lfloor\frac m j\rfloor\\ =(n^2-\sum_{i=1}^n i\lfloor\frac n i\rfloor(m^2-\sum_{j=1}^m m\lfloor\frac m j\rfloor\\ \]

例题五

\[\sum_{i=1}^n (n\bmod i(m\bmod i\\ \]

和上道题看着很像,不过这道题就很复杂了。

\[\sum_{i=1}^n (n\bmod i(m\bmod i\\ =\sum_{i=1}^n (n-i\lfloor\frac n i\rfloor(m-i\lfloor\frac m i\rfloor\\ =\sum_{i=1}^n (nm-(n+mi\lfloor\frac n i\rfloor+i^2\lfloor\frac n i\rfloor\lfloor\frac m i\rfloor\\ =n^2m-(n+m\sum_{i=1}^n i\lfloor\frac n i\rfloor+\sum_{i=1}^n i^2\lfloor\dfrac n i\rfloor\lfloor\frac m i\rfloor\\ \]

具体思想如下:

因此找出 \(\lfloor\dfrac n x\rfloor\ 变化的点和 \(\lfloor\dfrac m x\rfloor\ 变化的点中最近的一个,作为我们的 \(r\ 值。

for(LL l=1,r=0;l<=n;l=r+1
{
    r=min(n/(n/l,m/(m/l;
    ans=ans+(n/l*(m/l*(sum(r-sum(l-1;
}

这里出现了一个函数,它的作用是求出:\(sum_i=\sum\limits_{i=1}^ni^2\。

公式是 \(\sum\limits_{i=1}^ni^2=\dfrac {n(n+1\times(2n+1} 6\,用数学归纳法很好证明,这里不多赘述了。

编程笔记 » 浅谈整除分块

赞同 (24) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽