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 约数和 && 真丶除法分块的更多相关文章

  1. P2424 约数和 【整除分块】

    一.题目 P2424 约数和 二.分析 因为都是加法,那么肯定有的一个性质,即前缀和的思想,就是$$ { ans =\sum_{i=1}^y f(i)} - {\sum_{i=1}^x f(i)}   ...

  2. P2424 约数和

    题目背景 Smart最近沉迷于对约数的研究中. 题目描述 对于一个数X,函数f(X)表示X所有约数的和.例如:f(6)=1+2+3+6=12.对于一个X,Smart可以很快的算出f(X).现在的问题是 ...

  3. 杭电多校第七场 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 ...

  4. 【BZOJ】1257: [CQOI2007]余数之和(除法分块)

    题目 传送门:QWQ 分析 大佬和我说本题是除法分块,莫比乌斯反演中也有用到. QwQ我不会莫比乌斯反演啊~ 题目让我们求  $ \sum_{i=1}^n  k\mod n $ 然后根据$ a \mo ...

  5. HDU-6395 多校7 Sequence(除法分块+矩阵快速幂)

    Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  6. bzoj1257[CQOI2007]余数之和(除法分块)

    1257: [CQOI2007]余数之和 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 6117  Solved: 2949[Submit][Statu ...

  7. 除法分块 luogu2261 (坑)

    除法分块 除法分块 是指使用分块计算的方法求S=∑i=1n⌊ki⌋S=\sum^{n}_{i=1}{\lfloor{\frac{k}{i}}\rfloor}S=i=1∑n​⌊ik​⌋的值. 举个例子. ...

  8. Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ...

  9. Bzoj 2820: YY的GCD(莫比乌斯反演+除法分块)

    2820: YY的GCD Time Limit: 10 Sec Memory Limit: 512 MB Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x& ...

随机推荐

  1. 互评beta版本 - 探路者【贪吃蛇】

    基于NABCD评论,及改进建议 1)N(Need 需求) 开发本软件一方面是为了让80,90后用户重温童年的美好记忆,另一方面也是为了增加对英语学习兴趣较弱.意志力薄弱的中小学生学习英语的兴趣和动力, ...

  2. 奔跑吧DKY——团队Scrum冲刺阶段-Day 6

    今日完成任务 谭鑫:制作相应动画人物,并实现人物动画 黄宇塘:制作相应动画人物,并实现人物动画,制作背景图 赵晓海:制作相应动画人物,并实现人物动画 方艺雯:制作相应动画人物,并实现人物动画,编写博客 ...

  3. 每日Scrum(10)

    今天我们小组整合了下我们所编辑的程序,然后在界面上进行了修改和少部分的完善,现在就等着下午的验收了 任务展板 燃尽图如下:

  4. java-switch语句

    switch语句是常用的java循环判断语句,但是有的知识点并不一定清楚. 首先是switch语句括号中的判断条件,判断条件只能是整型或者字符和整型或者字符组成的表达式. 再就是case语句,可以称之 ...

  5. week4d:个人博客作业

    7,程序结果的显示 1,界面 2,选第一选项. 3,输入3个数后. 4,选择第一个. 5,输入第4个数字. 6,再次进行一轮游戏. 7,选择是否要看历史记录. 8,进入下一轮游戏. 9,开始第二轮数字 ...

  6. AVMoviePlayer 视频播放器

    AVMoviePlayer 是使用系统框架 MPMoviePlayerController 封装的视频播放器 一.功能: 1.根据手机旋转自由切换横竖屏:2.手势轻点显示/隐藏topView/bott ...

  7. Tween.js 动画效果

    一.apply,和call的用法. 先来一个与本次博文无关的东西,就是apply和call的用法.其实apply和call的用法都一样,只是他们的传参不一样.apply是数组,而call是单独的传,类 ...

  8. 11git更改提交

    .将不必要的文件add .上次提交觉得是错的 .不想改变暂存区内容,只是想调整提交的信息 .版本回滚 git reset HEAD 文件名 移除不必要的添加到暂存区的文件 git reset HEAD ...

  9. SpringBoot(六)_AOP统一处理请求

    什么是AOP AOP 是一种编程范式,与编程语言无关: 将通用逻辑从业务逻辑中分离出来(假如你的业务是一条线,我们不在业务线上写一行代码就能完成附加任务!我们会把代码写在其他的地方): 具体实现 (1 ...

  10. docker中间件安装记录

    rabbitmq docker pull rabbitmq docker run --restart=on-failure: --name rabbitmq -d -p : -p : docker.i ...