洛谷P2424 约数和 题解
题目
题解
此题可以说完全就是一道数学题,不难看出这道题所求的是 \(\sum\limits_{i=x}^{y}{\sum\limits_{d|i}{d}}\) 的值。
很显然,用暴力枚举肯定会超时。所以我们采用枚举约数的方法,对于每个数 \(d\) , \(1\) 到 \(n\) 间满足是\(d\)的倍数的共有\(\lfloor \frac{n}{d} \rfloor\)个数。所以我们构造一个函数
转换后所求的值为 \(f(y)-f(x-1)\) 。
接下来我们只需专注于求 \(f(n)\) 即可。如加粗部分所说,不难得出 \(f(n)\) 可以转换为
似乎到这里直接计算已经很不错了,复杂度只有 \(O(x+y)\) ,然而依然会TLE。
所以我们还要想办法优化,注意到一点,对于每一个 \(n\) ,都有若干的 \(d\) 满足 \(\lfloor\frac{n}{d}\rfloor\) 都相等。举个栗子,比如 \(8\) ,当 \(d\) 从 \(1\) 到 \(8\) 分别取值时, \(\lfloor\frac{n}{d}\rfloor\) 的值分别为
我们发现这里面有不少重复的数,我们则需要把这里面每个重复的数的个数算出来。
我们将 \(d\) 从 \(1\) 开始枚举,也就是 \(1\) 作为左界 \(l\) ,那么请问右界 \(r\) 为什么呢(即 \(\lfloor\frac{n}{r}\rfloor=\lfloor\frac{n}{l}\rfloor\) 且 \(\lfloor\frac{n}{r+1}\rfloor<\lfloor\frac{n}{l}\rfloor\) )?
其实很简单, \(r=\frac{n}{\lfloor n/l \rfloor}\) ,大家可以想一下是不是。然后运用等差数列求和的方式,对于每一个 \(\lfloor\frac{n}{l}\rfloor\) 结果 \(res\) 都要加上
下一步再将 \(l\) 置为 \(r+1\) ,如此循环,直到 \(l>n\) 为止。
由此,这道题就愉快地解决了。
贴一下代码
代码极短,但浓缩了数学的精华。
#include<iostream>
using namespace std;
long long s(int n)
{
if (n == 0)
return 0;
long long l, r;
long long res = 0;
for (l = 1; l <= n;l = r+1)
{
r = n / (n / l);
res += (n / l) * (r - l + 1) * (l + r)/2;
}
return res;
}
int main()
{
int x, y;
cin >> x >> y;
cout << s(y) - s(x - 1);
return 0;
}
原文地址:https://www.cnblogs.com/Mobius-strip/p/15170556.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- LeetCode刷题记录(easy难度21-40题)
- 一天一大 lee(移除盒子)难度:困难-Day20200815
- LeetCode刷题记录(easy难度1-20题)
- 改变 Python 中线程执行顺序的方法
- 一天一大 leet(整数拆分)难度:中等-Day20200730
- iOS客户端启动速度优化实践
- 一天一大 leet(魔术索引)难度:简单-Day20200731
- 一天一大 lee(回文对)难度:困难-Day20200806
- 一天一大 lee(扫雷游戏)难度:中等-Day20200820
- 一天一大 lee(重新安排行程)难度:中等-Day20200827
- 一天一大 lee(机器人能否返回原点)难度:简单-Day20200828
- 一天一大 lee(有序链表转换二叉搜索树)难度:中等-Day20200818
- 一天一大 lee(钥匙和房间)难度:中等-Day20200831
- 一天一大 lee(最短回文串)难度:困难-Day20200829
- 一天一大 lee(预测赢家)难度:中等-Day20200901