题目背景

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)的值。

输入输出样例

输入样例#1: 复制

2 4

输出样例#1: 复制

14

输入样例#2: 复制

123 321

输出样例#2: 复制

72543

说明

对于20%的数据有1≤X<Y≤105。

对于60%的数据有1≤X<Y≤1*107。

对于100%的数据有1≤X<Y≤2*109。

解题思路:首先我们定义一个F(x)=Σf(i)(i=1~x),所表示的是1-x的约数和,那么我们要求的答案即可表示成F(y)-F(x-1),现在的问题是对于任意x怎么求出F(x),我们知道对于任意一个数x在区间[1,n]中将会有n/x个数是x的倍数,所以我们就可以得到F(x)=Σi*(n/i) (i=1-x),我们可以举个例子:

例如:x=6;

由题目定义函数f(X)表示X所有约数的和

f(1)=1;

f(2)=1+2;

f(3)=1+3;

f(4)=1+2+4;

f(5)=1+5;

f(6)=1+2+3+6;

F(6)=f(1)+f(2)+f(3)+f(4)+f(5)+f(6)=1*6+2*3+3*2=4*1+5*1+6*1,我们就可以发现对于每个约数i,其对应的系数为x/i。

不过我们可以很容易发现这种做法的复杂度为O(y),而y的范围为1≤Y≤2*109,这样做肯定是超时的,所以我们必须想办法对我们的公式进行优化,又由公式F(x)=∑(⌊x/i​⌋∗i) (其中i=1~x) ,我们经过分析会发现由于x/i向下取整的特性,会导致有连续多个i对应x/i的值相同,我们可以举个例子:

对于当x=12,F(12)来说:

约数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

对于刚才的思路我们是直接枚举求和即F(12)=1*12+2*6+3*4+4*3+5*2+6*2+7*1+8*1+9*1+10*1+11*1+12*1,而这必定也会超时的。

但是由上面列举的情况我们可以发现,对于同一个系数,出现多个i值时,这些i的值时成等差数列的,对于该部分我们可以把它看成是一块,即采用分块思想,该部分我们可以直接采用等差求和公式O(1)便可得出结果,即假设约数i=l到i=r,其对应的系数x/i都为同一个值时,该部分对答案的贡献值为(r-l+1)*(l+r)/2再乘对应权值即x/i;采用这种思路的话,上面的例子我们的计算方法就变成

F(12)=12*(1-1+1)*(1+1)/2+6*(2-2+1)*(2+2)/2+4*(3-3+1)*(3+3)/2+3*(4-4+1)*(4+4)/2+2*(6-5+1)*(5+6)/2+1*(12-7+1)*(7+12)/2;

当n很大时,这样便可以大大提高算法的效率了。

不过对上面公式中出现的l和r怎么求呢?l比较好求,观察上面的数列,每计算一次l就变成上一个r加1,初始l=1。

而对于r,r=x/(x/l);其中x/l表示的是系数,我们需要找到一个最大的数r使得x/r=x/l,即r=x/(x/l),例如例子中l=7时,我们需要找到一个最大的数r使得12/r=12/7,所以r=12/(12/7);

这样我们的思路就理顺了,

首先初始化l=1,r=0,ans=0,

计算r的值r=x/(x/l);

利用等差求和公式求系数为x/i的约束对答案的贡献,即ans+=(x/l)*(r-l+1)*(r+1)/2;

l=r+1,进入下一块区域。

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const LL maxn=1e6+10;
int n,q,m,r,tot,time;
LL cal(LL x){LL l=1,r=0,ans=0;while(l<=x){r=x/(x/l);  //计算这块的右边界ans+=(x/l)*(r-l+1)*(l+r)/2; //答案加上系数为x/l的块的贡献值 等差求和l=r+1;}return ans;
}
int main(){LL x,y;cin>>x>>y;cout<<cal(y)-cal(x-1)<<endl;return 0;
}

转载于:https://www.cnblogs.com/zjl192628928/p/10543825.html

codevs 2606 约数和(分块优化数学公式 )相关推荐

  1. lightoj 1098 A New Function 约数之和(一道奇怪的数论) 整除分块优化

    文章目录 题目如下: 思考人生: 题目如下: lightoj 1098 A New Function 求1-n所有数的所有约数之和(不包括1和它本身).n<=2e9. 思考人生: 首先考虑打表找 ...

  2. P1494-[国家集训队]小Z的袜子【分块优化莫队】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P1494 题目大意 区间任意取两个数,求取到相同的数的概率. 解题思路 ...

  3. [jzoj 3912] 超氧化钾 {约数+除数分块}

    题目 Description 作为一个化学小考只有77分的同学,小W感觉很有压力,所以他决定搞化学.今天他开始研究超氧化钾,这是一种很神奇的离子化合物,在高温下空间结构是立方体,如下图所示.有一天教黄 ...

  4. Codeforces Round #740 (Div. 2) D2. Up the Strip dp + 分块优化 + 逆向思维

    传送门 文章目录 题意: 思路 题意: 有nnn个细胞,你初始在第nnn细胞上,假设你当前在xxx处,你每次可以进行如下两个操作: (1)(1)(1)选择[1,x−1][1,x-1][1,x−1]内一 ...

  5. [CodeForces 1603C] Extreme Extension(贪心 + 数论分块优化dp)

    problem CodeForces solution observation1:\text{observation1}:observation1: 对于一个非空子段 [l,r][l,r][l,r], ...

  6. BZOJ 2301 Problem b(莫比乌斯反演+分块优化)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=37166 题意:对于给出的n个询问,每次求有多少个数对(x,y),满 ...

  7. 数据库 大数据访问及分区分块优化方案

    本文导读:当系统要满足每秒数万次的读写请求的需求时,我们可以用分布式计算.编写优良的程序代码.对海量数据进行分区操作.建立广泛的索引.建立缓存机制.加大虚拟内存.分批处理.使用数据仓库和多维数据库存储 ...

  8. Codevs 3269 混合背包(二进制优化)

    3269 混合背包 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为V ...

  9. 程序性能优化探讨(6)——矩阵乘法优化之分块矩阵

    有一种性格叫做偏执,有一种矩阵优化运算叫做分块.实话说,也许我这辈子也用不上这种随牛B但很复杂的算法,有些版本的教材直接删除这个内容.但越是这样我越想不过,因此借写这篇博客,把分块矩阵乘法彻底分析清楚 ...

最新文章

  1. 笔记本电脑处理器_苹果高管:我们都没有想到M1的性能有那么强|英特尔|处理器|iphone|ipad|笔记本电脑...
  2. 配置 Hdp 4 Window 中的一些问题
  3. 基于plotly数据可视化_如何使用Plotly进行数据可视化
  4. java 替换多个字符串_Java一次(或以最有效的方式)替换字符串中的多个不同子字符串...
  5. delphi制作上下开幕效果_2019中超联赛揭幕战在深圳举行 现场开幕式亮点多多
  6. 高级考题_理论干货最最直观的词云分布,带你一次看清天大考题端倪!
  7. Windows遇到ERR_NETWORK_ACCESS_DENIED处理方案
  8. linux面试题与参考答案(转)
  9. 网络专业人士笔记(7~11章)
  10. PNG文件格式具体解释
  11. 201809-1 卖菜
  12. arduino 智能车组装步骤_Arduino智能小车硬件安装说明
  13. Nuxt.js mini聊天室代码
  14. 树莓派——CSI摄像头和USB摄像头的配置与调试
  15. 面试求职-你们想知道的腾讯面经
  16. ROS 学习踩坑笔记5-Intel D435相机不发布点云,在RVIZ中,不显示点云(wants topic /image/compressed to have datatype/md5sum)
  17. 别不信,小宝宝爱盯着妈妈看原来跟大脑发育有关
  18. arcgis10.2以上版本转换测量队节点所在TXT为所需格式(arctoolbox-samples-features-creat featrure from text file所需要的面格式)
  19. 4.服务器的品牌和型号
  20. 苹果⼿手机实时和历史位置定位指南

热门文章

  1. 计算机与十进制 教案,二进制与十进制间的转换教案
  2. html显示本地磁盘 图片,手把手教你为本地磁盘增添背景图片(图解)
  3. Linux内核启动速度优化,嵌入式Linux启动时间优化的秘密之五-Bootloader
  4. 计算机专业的学员为什么要学erp,对要进入计算机专业学习的人的小小建议(浅谈)...
  5. mysql获取两个表中日期字段的最小差值
  6. win10系统配置apache 2.4的虚拟主机以及查看 apache的版本
  7. 大厂首发:java转算法工程师
  8. python【Matlibplot绘图库】绘制用于学术论文投稿的黑白图片
  9. Android 程序打包
  10. android 动画引擎,一个使用openGL渲染的炫丽Android动画库