P2424 约数和 && 真丶除法分块
P2424 约数和
题目背景
Smart最近沉迷于对约数的研究中。
题目描述
对于一个数X,函数f(X)表示X所有约数的和。例如:f(6)=1+2+3+6=12。对于一个X,Smart可以很快的算出f(X)。现在的问题是,给定两个正整数X,Y(X<Y),Smart希望尽快地算出f(X)+f(X+1)+……+f(Y)的值,你能帮助Smart算出这个值吗?
输入输出格式
输入格式:
输入文件仅一行,两个正整数X和Y(X<Y),表示需要计算f(X)+f(X+1)+……+f(Y)。
输出格式:
输出只有一行,为f(X)+f(X+1)+……+f(Y)的值。
**错误日志: 传导参数的时候没有用 \(LL\) **
Solution
首先利用前缀和的思想, 我们只要能求出 \(1 - n\) 的约数和的和, 就能求出一段区间的约数和的和
那么如何快速求出从 \(1\) 开始约数和的和呢
很朴素大暴力万岁!的算法是 \(O(\sqrt{n})\) 计算每个数的约数进行累加 ,然后慢到爆炸
我们可以换种思维, 考虑枚举约数
显然对于一个约数 \(d\) , 在 \(1 - n\) 中出现过 \(\lfloor \frac{n}{d}\rfloor\) 次, 所以这一约数贡献的答案为 \(\lfloor \frac{n}{d}\rfloor * d\)
所以 \(1-n\) 总因数和为 $$\sum_{i = 1}^{n}\lfloor \frac{n}{i}\rfloor * i$$
这样依然需要枚举 \(1-n\) 这 \(n\) 个因数, \(O(n)\) 依然达不到复杂度要求
其实看到 \(\lfloor \frac{n}{d}\rfloor\) 时我们很兴奋: 除法分块!
(之前学的除法分块是假的。。现在补个真的)
比如说当 \(n = 12\) 时, 我们分别计算 \(\lfloor\frac{n}{i}\rfloor\ (1 <= i <= n)\) 可以得到以下结果:
\(12,6,4,3,2,2,1,1,1,1,1,1\)
注意有部分连续的向下取整值是一样的!除法分块就是 利用打表找规律 来求出每个区间的左右端点以达到进行快速运算的目的
左端点很容易求解, 即为上一个右端点 +1(初始值为1)
右端点通过打表找规律可知: \(r = n / (n / l)\)
然后就先配一个除法分块的板子
for(LL l = 1,r;l <= n;l = r + 1){
		r = n / (n / l);
		//向下取整的答案为 (n / l)
		//区间长度为(r - 1 +1)
		//这里操作
		}
于是我们得到的这一个区间的每个因数的数量都是 \((n / l)\)
这些因数有哪些呢? 当然就是 \(l - r\) 里头这些啦
然后很显然这些因数构成了一个等差数列, 单对于这一区间因数来说, 其和为 \((l + r) * (r - l + 1) / 2\)
每个因数有 \((n / l)\) 个, 所以这一区间对答案的贡献为 \((n / l) * (l + r) * (r - l + 1) / 2\)
于是有核心代码:
LL get_sum(LL n){
	LL ans = 0;
	for(LL l = 1,r;l <= n;l = r + 1){
		r = n / (n / l);
		ans += (n / l) * (l + r) * (r - l + 1) / 2;
		}
	return ans;
	}
前缀和一减就完事了, 复杂度 \(O(\sqrt{n})\)
最后感谢学长提供好题,真的搞懂了除法分块 (ヾ(▽*))))
Code
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
typedef long long LL;
using namespace std;
LL RD(){
    LL out = 0,flag = 1;char c = getchar();
    while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
    while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
    return flag * out;
    }
LL x, y;
LL get_sum(LL n){
	LL ans = 0;
	for(LL l = 1,r;l <= n;l = r + 1){
		r = n / (n / l);
		ans += (n / l) * (l + r) * (r - l + 1) / 2;
		}
	return ans;
	}
int main(){
	x = RD(), y = RD();
	printf("%lld\n", get_sum(y) - get_sum(x - 1));
	return 0;
	}
P2424 约数和 && 真丶除法分块的更多相关文章
- P2424 约数和 【整除分块】
		一.题目 P2424 约数和 二.分析 因为都是加法,那么肯定有的一个性质,即前缀和的思想,就是$$ { ans =\sum_{i=1}^y f(i)} - {\sum_{i=1}^x f(i)} ... 
- P2424 约数和
		题目背景 Smart最近沉迷于对约数的研究中. 题目描述 对于一个数X,函数f(X)表示X所有约数的和.例如:f(6)=1+2+3+6=12.对于一个X,Smart可以很快的算出f(X).现在的问题是 ... 
- 杭电多校第七场 1010 Sequence(除法分块+矩阵快速幂)
		Sequence Problem Description Let us define a sequence as below f1=A f2=B fn=C*fn-2+D*fn-1+[p/n] Your ... 
- 【BZOJ】1257: [CQOI2007]余数之和(除法分块)
		题目 传送门:QWQ 分析 大佬和我说本题是除法分块,莫比乌斯反演中也有用到. QwQ我不会莫比乌斯反演啊~ 题目让我们求 $ \sum_{i=1}^n k\mod n $ 然后根据$ a \mo ... 
- HDU-6395 多校7 Sequence(除法分块+矩阵快速幂)
		Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ... 
- bzoj1257[CQOI2007]余数之和(除法分块)
		1257: [CQOI2007]余数之和 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 6117 Solved: 2949[Submit][Statu ... 
- 除法分块 luogu2261 (坑)
		除法分块 除法分块 是指使用分块计算的方法求S=∑i=1n⌊ki⌋S=\sum^{n}_{i=1}{\lfloor{\frac{k}{i}}\rfloor}S=i=1∑n⌊ik⌋的值. 举个例子. ... 
- Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)
		2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ... 
- Bzoj 2820: YY的GCD(莫比乌斯反演+除法分块)
		2820: YY的GCD Time Limit: 10 Sec Memory Limit: 512 MB Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x& ... 
随机推荐
- Linux 读书笔记 三  (第二章)
			一.学习目标 1. 理解二进制在计算机中的重要地位 2. 掌握布尔运算在C语言中的应用 3. 理解有符号整数.无符号整数.浮点数的表示 4. 理解补码的重要性 5. 能避免C语言中溢出,数据类型转 ... 
- 如何获取启动页activity
			启动页activity指App启动的第一个activity,介绍几种查看启动页activity的方法: 方法一:问开发,最有效的获取方式 方法二:dumpsys package 包名,前提是知道包名( ... 
- jsp九大内置对象之二response
			这里主要写response向浏览器输出数据时的编码,输出数据有两种: response.getOutStram().write("讲讲".getBytes("utf-8& ... 
- java异常处理及自定义异常的使用
			1. 异常介绍 异常机制可以提高程序的健壮性和容错性. Throwable:Throwable是java语言所有错误或异常的超类. 有两个子类Error和Exception. 1.1 编译期异常 编译 ... 
- Java大数——快速矩阵幂
			Java大数——快速矩阵幂 今天做了一道水题,尽管是水题,但是也没做出来.最后问了一下ChenJ大佬,才慢慢的改对,生无可恋了.... 题目描述: 给a,b,c三个数字,求a的b次幂对c取余. 数据范 ... 
- Java中的常见异常
			非检查异常:Error 和 RuntimeException 以及他们的子类.0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界Ar ... 
- JTS
			在这个系列的 第 1 部分,我们讨论了事务并研究了它们的基本属性 ― 原子性(atomicity).一致性(consistency).孤立性(isolation)和持久性(durability).事务 ... 
- 微信小程序之Flex布局
			微信小程序页面布局方式采用的是Flex布局.Flex布局,是W3c在2009年提出的一种新的方案,可以简便,完整,响应式的实现各种页面布局.Flex布局提供了元素在容器中的对齐,方向以及顺序,甚至他们 ... 
- iOS- 多线程中如何去保证线程安全
			一.前言 前段时间看了几个开源项目,发现他们保持线程同步的方式各不相同,有@synchronized.NSLock.dispatch_semaphore.NSCondition.pthread_mut ... 
- Swift-KVC构造函数中数据类型和私有属性
