上模板题例题:

[CQOI2007]余数求和

洛谷

BZOJ

题目大意:求 $\sum^n_{i=1}k\ mod\ i$ 的值。

等等……这题就学了三天C++的都会吧?

$1\leq n,k\leq 10^9$。(一口老血喷到屏幕上)

$O(n)$ 行不通了,考虑别的做法。


我们来看一下 $\lfloor\frac{x}{i}\rfloor$ 的值。

$x=9$:(不包括0,只有4种取值?)

i

1 2 3 4 5 6 7 8 9 10
x/i 9 4 3 2 1 1 1 1 1

0

$x=12$:(不包括0,只有6种取值?)

i 1 2 3 4 5 6 7 8 9 10 11 12
x/i 12 6 4 3 2 2 1 1 1 1 1

1

貌似 $\lfloor\frac{x}{i}\rfloor$ 取值数不是很多?

我们来估算一下 $\lfloor\frac{x}{i}\rfloor$ 的不同取值个数:

当 $1\leq i\leq \lfloor\sqrt{x}\rfloor$ 时,$i$ 都只有 $\lfloor\sqrt{x}\rfloor$ 个,不同的取值数肯定不会更多。

当 $\lfloor\sqrt{x}\rfloor\leq i\leq x$ 时,$1\leq\lfloor\frac{x}{i}\rfloor\leq\lfloor\sqrt{x}\rfloor$,不同的取值数肯定 $\leq\lfloor\sqrt{x}\rfloor$ 个。

综上,不同取值数是 $\sqrt{x}$ 级别的。

然后我们可以发现相同的数是连续的一段。那么我们可以通过这个特点把 $\lfloor\frac{x}{i}\rfloor$ 分成几段,每一段的数相等,那么这一段的和就是长度 $\times$ 这个相同的数。

因为不同取值只有 $\sqrt{x}$ 个,所以这样加速后的时间复杂度是 $O(\sqrt{x})$,比 $O(x)$ 快了不少。这就是整除分块。


回到原题。

求 $\sum^n_{i=1}k\ mod\ i$ 的值。

这个……看着和整除分块没什么大关系的样子?

我们看这个 $mod$ 真碍眼,把它拆开。

$k\ mod\ i=k-i\times\lfloor\frac{k}{i}\rfloor$

那么就有:

$\ \sum^n_{i=1}k\ mod\ i$

$=\sum^n_{i=1}k-i\times\lfloor\frac{k}{i}\rfloor$

$=nk-\sum^n_{i=1}i\times\lfloor\frac{k}{i}\rfloor$

后面这个式子貌似可以整除分块了……怎么算呢?

我们考虑 $[l,r]$ 这段区间的求和,其中 $\lfloor\frac{k}{i}\rfloor=x:i\in [l,r]$。

$\ \sum^r_{i=l}i\times\lfloor\frac{k}{i}\rfloor$

$=\sum^r_{i=l}i\times x$

$=x\sum^r_{i=l}i$

$=\frac{x(l+r)(r-l+1)}{2}$

这样就不是很难了。


话说讲了这么久也没讲怎么枚举一段相同区间的左端点和右端点。

我们这样扫描:

一开始 $l=1$ 显而易见。

求出对应的 $r$。

这个区间求完了,下一个 $l$ 应该是下一个还没扫过的位置,即 $l=r+1$。

一直重复直到 $l$ 到了上界,也就是扫完了。

怎么求对应的 $r$ 呢?

既然 $\lfloor\frac{k}{l}\rfloor=\lfloor\frac{k}{r}\rfloor$,且 $r$ 是右端点(最大)

那么 $r=\frac{k}{\frac{k}{l}}$。(当然可能要跟枚举上界取一个min,视情况而定)

整除分块模板大概如下:

 for(int l=,r;l<=n;l=r+){
r=n/(n/l);
//do something...
}

那么这题代码实现就不难了。需要注意本题有不少坑点,详见代码。(没错,代码并没有你想象的那么长!)

时间复杂度貌似是 $O(\sqrt{min(k,n)})$,空间复杂度 $O(1)$

#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll; //long long是需要的
ll n,k,ans;
int main(){
cin>>n>>k;
ans=n*k;
for(ll l=,r;l<=min(n,k);l=r+){ //与上界取min!
r=min(k/(k/l),n); //与上界取min!
ans-=(k/l)*(l+r)*(r-l+)/;
}
cout<<ans<<endl;
}

整除分块的超简短代码

另外再推荐几题。抱歉只找到一题,虽说也不错

洛谷P3935 Calculating 题解戳我

整除分块学习笔记+[CQOI2007]余数求和(洛谷P2261,BZOJ1257)的更多相关文章

  1. 莫比乌斯反演&整除分块学习笔记

    整除分块 用于计算$\sum_{i=1}^n f(\lfloor{n/i} \rfloor)*i$之类的函数 整除的话其实很多函数值是一样的,对于每一块一样的商集中处理即可 若一个商的左边界为l,则右 ...

  2. 莫比乌斯反演学习笔记+[POI2007]Zap(洛谷P3455,BZOJ1101)

    先看一道例题:[POI2007]Zap BZOJ 洛谷 题目大意:$T$ 组数据,求 $\sum^n_{i=1}\sum^m_{j=1}[gcd(i,j)=k]$ $1\leq T\leq 50000 ...

  3. P2261 [CQOI2007]余数求和 【整除分块】

    一.题面 P2261 [CQOI2007]余数求和 二.分析 参考文章:click here 对于整除分块,最重要的是弄清楚怎样求的分得的每个块的范围. 假设$ n = 10 ,k = 5 $ $$  ...

  4. [洛谷P2261] [CQOI2007]余数求和

    洛谷题目链接:[CQOI2007]余数求和 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n ...

  5. 洛谷 P2261 [CQOI2007]余数求和 解题报告

    P2261 [CQOI2007]余数求和 题意: 求\(G(n,k)=\sum_{i=1}^n k \ mod \ i\) 数据范围: \(1 \le n,k \le 10^9\) \(G(n,k)\ ...

  6. 洛谷——P2261 [CQOI2007]余数求和

    P2261 [CQOI2007]余数求和 关键在于化简公式,题目所求$\sum_{i=1}^{n}k\mod i$ 简化式子,也就是$\sum_{i=1}^{n}(k-\frac{k}{i}\time ...

  7. [Luogu 2261] CQOI2007 余数求和

    [Luogu 2261] CQOI2007 余数求和 这一定是我迄今为止见过最短小精悍的省选题了,核心代码 \(4\) 行,总代码 \(12\) 行,堪比小凯的疑惑啊. 这题一看暴力很好打,然而 \( ...

  8. 题解 P2261【[CQOI2007]余数求和】

    P2261[[CQOI2007]余数求和] 蒟蒻终于不看题解写出了一个很水的蓝题,然而题解不能交了 虽然还看了一下自己之前的博客 题目要求: \[\sum_{i=1}^{n}{k \bmod i} \ ...

  9. [Luogu P2261] [CQOI2007]余数求和 (取模计算)

    题面 传送门:https://www.luogu.org/problemnew/show/P2261 Solution 这题显然有一个O(n)的直接计算法,60分到手. 接下来我们就可以拿出草稿纸推一 ...

随机推荐

  1. 从0开始学golang--2.1--如何去爬园子的数据

    20天过去了,才开始写...主要还是因为自己懒吧.之前一边上班一边也有挤时间练习golang,可是写博客却老是不能行动,跑步也没跑了.突然的就懈怠了快一个月.可能也和开始玩the elder scro ...

  2. 【实战】verilog中`define的使用记录

    背景: 在最近实战开发中发现:对外部芯片进行初始化时,往往需要定义大量参数. 若直接在module中通过localparam或者parameter进行参数定义的话,会带来两个问题: 1.代码长度增加, ...

  3. 20155204 王昊《网络对抗技术》EXP3

    20155204 王昊<网络对抗技术>EXP3 一.基础问题回答 1.杀软是如何检测出恶意代码的? 答: 基于特征码:一段特征码就是一段或多段数据.(如果一个可执行文件(或其他运行的库.脚 ...

  4. 20155207 《网络对抗》exp4 恶意代码分析 学习总结

    20155207 <网络对抗> 恶意代码分析 学习总结 实践目标 1.是监控你自己系统的运行状态,看有没有可疑的程序在运行. 2.是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件 ...

  5. 20155232《网络对抗》Exp 6 信息搜集与漏洞扫描

    20155232<网络对抗>Exp 6 信息搜集与漏洞扫描 一.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版 ...

  6. Javascript与后台相互访问

    (1)Javascript访问C#后台变量或函数 A.通过<%=%>的形式访问 var str = "<%=GetStr() %>"; var str = ...

  7. 通过实例来理解paxos算法

    背景   Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的”La”,此人现在在微软研究院)于1990年提出的一种基于消息传递的一致性算法.由于算法难以理解起初并没有 ...

  8. SQL Server 全文搜索

    SQL Server 的全文搜索(Full-Text Search)是基于分词的文本检索功能,依赖于全文索引.全文索引不同于传统的平衡树(B-Tree)索引和列存储索引,它是由数据表构成的,称作倒转索 ...

  9. 起步 - vue-router路由与页面间导航

    vue-router 我们知道路由定义了一系列访问的地址规则,路由引擎根据这些规则匹配找到对应的处理页面,然后将请求转发给页进行处理.可以说所有的后端开发都是这样做的,而前端路由是不存在"请 ...

  10. Jmeter(十八)_Ubuntu部署jmeter与ant

    Docker部署接口自动化持续集成环境第三步,容器化Jmeter与ant! 接上文:Docker_容器化jenkins 为了整合接口自动化的持续集成工具,我将jmeter与ant都部署在了Jenkin ...