当前位置: 首页 > news >正文

#G. 求约数个数之六


我们先求到区间[1..b]之间的所有约数之和

于是结果就等于

[1..b]之间的所有约数之和减去[1..a-1]之间的约数之和

很明显这两个问题是同性质的问题,只是右端点不同罢了.

明显对于1到N之间的数字,其约数范围也为1到N这个范围内。

于是我们可以枚举约数L,当然这个枚举不可能是for循环枚举,而是如上题一样“跳跃式的”

于是N/L就代表1到N之间有多少个数字是L的倍数,L也必为它们的约数。

例如当L=7时,N=20时

N/20=2,说明1到20以内有两个数字是7的倍数,易知为7,14,也就是说在算7和14的约数之和时,必然要将7统计进去。

然后这个算法高明的地方在于

当L=8,9,10时,N/L=2

于是这一段的L=7,R=10

于是这一段的约数之和为2*7+2*8+2*9+2*10=2*(7+8+9+10)=2*(7+10)*(10-7+1)/2

当统计完这一段后,设L=R+1=10+1=11

会发现11做为约数,只会出现1次

同时还会发现12,13,14.........20整个这一段的约数,都只会出现1次


#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m;
ll f(ll x)
{ll l = 1,r = 0,k = 0,ans = 0,m = 0;while(l <= x){r = x / (x / l);k = x / l;ans += k * (l + r) * (r - l + 1) / 2;l = r + 1;}return ans;
}
signed main()
{cin>>n>>m;cout<<f(m) - f(n - 1);return 0;
}
http://www.lryc.cn/news/17771.html

相关文章:

  • 如何为Java文件代码签名及添加时间戳?
  • Xamarin.Forsm for Android 显示 PDF
  • RK3399平台开发系列讲解(LED子系统篇)LED子系统详解
  • LeetCode 432. 全 O(1) 的数据结构
  • 再析jvm
  • 社招前端二面面试题总结
  • 人人能读懂redux原理剖析
  • uniCloud云开发----7、uniapp通过uni-swiper-dot实现轮播图
  • IM即时通讯构建企业协同生态链
  • Python实现构建gan模型, 输入一个矩阵和两个参数值,输出一个矩阵
  • 开学准备哪些电容笔?ipad触控笔推荐平价
  • 放下和拿起 解放自己
  • 100%BIM学员的疑惑:不会CAD可以学Revit吗?
  • 经常会采坑的javascript原型应试题
  • 完全背包—动态规划
  • 消息队列MQ介绍
  • C语言进阶(八)—— 链表
  • 手工测试用例就是自动化测试脚本——使用ruby 1.9新特性进行自动化脚本的编写
  • RockerMQ简介和单节点部署
  • SFP光纤笼子 别称 作用 性能要点 工程要素
  • [HarekazeCTF2019]Easy Notes
  • Java学习-IO流-字符流-FileReader
  • python攻陷米哈游《元神》数据?详情请看文章。。
  • 【unity细节】基于unity子对象(如相机)为什么无法进行z轴的拖拽移动和z轴自动归位的问题
  • 如何维护固态继电器?
  • Sprng依赖注入(三):构造方法注入是如何工作的?
  • 「1」指针进阶——详解
  • JS语法让人困惑的点 “==与===”
  • 《狂飙》壁纸大嫂如此惊艳,做成日历壁纸天天看
  • 手机照片删除了怎么恢复