嘘~ 正在从服务器偷取页面 . . .

洛谷P2261 [CQOI2007]余数求和 题解


洛谷P2261 [CQOI2007]余数求和 题解

题目链接:P2261 [CQOI2007]余数求和

题意

给定 \(n,k\) ,求 \[ G(n,k)= \sum_{i=1}^{n}k \bmod i \] 数据范围

\(1 \le n,k \le 10^9\)

考虑数论分块

注意到 \[ \begin{aligned} \sum_{i=1}^{n}k \bmod i &= \sum_{i=1}^{n}\left(k-i\left\lfloor\dfrac{k}{i}\right\rfloor\right)\\ &=nk-\sum_{i=1}^{n}i\left\lfloor\dfrac{k}{i}\right\rfloor \end{aligned} \]\(k < n\) ,显然 \(\forall i > k\)\(\left\lfloor\dfrac{k}{i}\right\rfloor=0\)

故可直接计算 \[ nk-\sum_{i=1}^{k}i\left\lfloor\dfrac{k}{i}\right\rfloor \]\(k \ge n\) ,则判断一下右边界不要超过 \(n\) 即可

时间复杂度 \(\mathcal{O}(\sqrt{n})\)

代码如下

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,k;
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin >> n >> k;int res=n*k;
    for(int l=1,r; l<=min(k,n); l=r+1)
    {
        r=min(k/(k/l),n);
        res-=(k/l)*(r-l+1)*(l+r)/2;
    }
    cout << res << endl;
    return 0;
}

文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录