整除分块

整除分块

例题:

已知 f(n)=i=1nni,给定 n,求 f(n) 的值。

固然可以 O(n) 暴力,但显然会TLE

计算一下前几项的值之后可以发现ni 的取值在连续的一段区间内是相同的,那么就可以将其分为若干块分别进行计算。

先让 l 为区间的左端点,那么这块的值都为 k=nlr=max(i)=nk。将 k 代入,得到 r=nnl。这样每一块的左右端点都能用确定的式子得到了。这样分块的值就为单值 × 区间长度,即 k×(rl+1)

 

模板:

代码
ll division_block(ll n){
	ll res = 0;
    for(ll l = 1, r; l <= n; l = r + 1){
        r = n / (n / l);
        res += n / l * (r - l + 1);
    }
    return res;
}

 

posted @   programmingysx  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示