整除分块学习笔记+[CQOI2007]余数求和(洛谷P2261,BZOJ1257)
上模板题例题:
[CQOI2007]余数求和
题目大意:求 $\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;
}
整除分块的超简短代码
另外再推荐几题。抱歉只找到一题,虽说也不错
整除分块学习笔记+[CQOI2007]余数求和(洛谷P2261,BZOJ1257)的更多相关文章
- 莫比乌斯反演&整除分块学习笔记
整除分块 用于计算$\sum_{i=1}^n f(\lfloor{n/i} \rfloor)*i$之类的函数 整除的话其实很多函数值是一样的,对于每一块一样的商集中处理即可 若一个商的左边界为l,则右 ...
- 莫比乌斯反演学习笔记+[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 ...
- P2261 [CQOI2007]余数求和 【整除分块】
一.题面 P2261 [CQOI2007]余数求和 二.分析 参考文章:click here 对于整除分块,最重要的是弄清楚怎样求的分得的每个块的范围. 假设$ n = 10 ,k = 5 $ $$ ...
- [洛谷P2261] [CQOI2007]余数求和
洛谷题目链接:[CQOI2007]余数求和 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n ...
- 洛谷 P2261 [CQOI2007]余数求和 解题报告
P2261 [CQOI2007]余数求和 题意: 求\(G(n,k)=\sum_{i=1}^n k \ mod \ i\) 数据范围: \(1 \le n,k \le 10^9\) \(G(n,k)\ ...
- 洛谷——P2261 [CQOI2007]余数求和
P2261 [CQOI2007]余数求和 关键在于化简公式,题目所求$\sum_{i=1}^{n}k\mod i$ 简化式子,也就是$\sum_{i=1}^{n}(k-\frac{k}{i}\time ...
- [Luogu 2261] CQOI2007 余数求和
[Luogu 2261] CQOI2007 余数求和 这一定是我迄今为止见过最短小精悍的省选题了,核心代码 \(4\) 行,总代码 \(12\) 行,堪比小凯的疑惑啊. 这题一看暴力很好打,然而 \( ...
- 题解 P2261【[CQOI2007]余数求和】
P2261[[CQOI2007]余数求和] 蒟蒻终于不看题解写出了一个很水的蓝题,然而题解不能交了 虽然还看了一下自己之前的博客 题目要求: \[\sum_{i=1}^{n}{k \bmod i} \ ...
- [Luogu P2261] [CQOI2007]余数求和 (取模计算)
题面 传送门:https://www.luogu.org/problemnew/show/P2261 Solution 这题显然有一个O(n)的直接计算法,60分到手. 接下来我们就可以拿出草稿纸推一 ...
随机推荐
- 2.4《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——小结
下Table 3本章重要命令小结 命令 描述 示例 > 将输出内容重定向到指定文件中 $ echo foo > foo.txt >> 将输出内容添加到指定问价中 $ echo ...
- Java基础—面向对象
一.什么叫面向对象 万物皆对象(待更正) 二.面向对象三大特征 抽象:把一类对象共同特征进行抽取构造类的过程,包括两种抽象:第一种是数据抽象,也就是对象的属性.第二种是过程抽象,也就是对象的行为 封装 ...
- 20155223 Exp3 免杀原理与实践 实验报告
20155223 Exp3 免杀原理与实践 实验报告 实验前准备 安装Veil-Evasion 直接使用Kali快速安装命令,拒绝采用git安装命令 apt-get -y install veil-e ...
- 2017-2018-2 20155224『网络对抗技术』Exp8:Web基础
实践具体要求 Web前端HTML(0.5分) 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. Web前端javascipt(0.5分) 理 ...
- 20155237 《JAVA程序设计》实验三(敏捷开发与XP实践)实验报告
20155237 <JAVA程序设计>实验三(敏捷开发与XP实践)实验报告 实验内容 敏捷开发与XP实践 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习 ...
- EZ 2018 05 01 NOIP2018 模拟赛(十一)
莫名其妙暴涨Rating 其实题目都挺好挺简单的,但是越简单就越容易ZZ 不理解问什么第一题这么多人找环 不过T2是真心细节题,T3太难了 题目戳这里 T1 仔细分析题意发现那个交换规则就是废话,如果 ...
- 如何安装ipa文件(二)
第一篇文章请看: http://www.cnblogs.com/BK-12345/p/6000124.html 写第二篇的目的是因为iTunes更新了,有一些东西发生了变化,应用没有了,其实还是存在的 ...
- Hyperledger Fabric v1.1.0安装记录(国内源版)
1. 安装虚拟机 虚拟机软件采用:VirtualBox 操作系统选择:Ubuntu 14.04 内存:4G CPU:2核 硬盘:20G 2.(可选)更改 ...
- Linux内核实验作业四
实验作业:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 20135313吴子怡.北京电子科技学院 [第一部分]使用库函数API来获取用户标识号.库函数为getuid() 代码如下: ...
- team330团队铁大兼职网站使用说明
项目名称:铁大兼职网站 项目形式:网站 网站链接:http://39.106.30.16:8080/zhaopinweb/mainpage.jsp 开发团队:team330 网站上线时间:2018年1 ...