P9611 题解

news/2024/10/5 11:06:16

题目大意


从题目可知,本题要求求出\(l \sim r\)的因子个数和。

题目分析


我们可以将这个问题分解为两个问题,变成求\(1 \sim r\)的因子个数和减去\(1 \sim l-1\)的因子个数和,然后我们考虑如何求\(1 \sim n\)的因子个数和

首先,如果正着做很难的话,我们可以考虑反着做

对于一个数\(x\),因为在\(1 \sim n\)中,有\(\lfloor n \div x \rfloor\)个数能被\(x\)整除,所以它对于因子个数的贡献为\(\lfloor n \div x \rfloor\)

根据这个原理,我们可以写出一个时间复杂度为\(\mathcal{O}\left(n\right)\)的TLE程序:

#include<bits/stdc++.h>
#define int long long 
const int N = 1e5+5;
const int Mod = 1e9+7;
using namespace std;
int l, r;
int f(int n)
{int cnt = 0;for(int i = 1; i <= n; i++){cnt += n / i;}return cnt;
}
signed main()
{cin >> l >> r;cout << f(r) - f(l - 1) << endl;return 0;
}

看来我们要把时间复杂度降到\(\mathcal{O}\left(\sqrt n\right)\)才可以。

可以想到,对于每一个数,他的因数必然是成对的(平方数除外),那么我们只需要遍历到\(\lfloor \sqrt n \rfloor\),最后再乘以二即可。但是我们会发现,这样计算的结果比正确结果大很多,为什么呢?因为会有重复。所以我们要把重复的减去,这样才可以得到正确的结果。

那么现在我们要考虑哪些部分会重复。

我们以\(n\)\(9\)为例:

数字 因数
\(1\) \(1\)
\(2\) \(1,2\)
\(3\) \(1,3\)
\(4\) \(1,2,4\)
\(5\) \(1,5\)
\(6\) \(1,2,3,6\)
\(7\) \(1,7\)
\(8\) \(1,2,4,8\)
\(9\) \(1,3,9\)

我们的贡献统计是这样的:

数字 贡献数字对
\(1\) \(1\times\red1,1\times2,1\times3,1\times4,1\times5,1\times6,1\times7,1\times8,1\times9\)
\(2\) \(\red2\times\red1,2\times\red2,2\times3,2\times4\)
\(3\) \(\red3\times\red1,\red3\times\red2,3\times\red3\)

通过观察重复的标红部分,我们发现每个数刚好重复了\(\lfloor \sqrt n \rfloor\)次!为什么会这样呢?因为每一个数乘上另外一个数,如果反过来还在表里面,那么就会重复。在表里面有\(\lfloor \sqrt n \rfloor\)个数,每个数会重复\(\lfloor \sqrt n \rfloor\)次,所以总共会重复\(\lfloor \sqrt n \rfloor\times\lfloor \sqrt n \rfloor\)次。

于是我们便可以完成最后的代码:

AC Code


#include<bits/stdc++.h>
#define int long long 
const int N = 1e5+5;
const int Mod = 1e9+7;
using namespace std;
int l, r;
int f(int n)
{int cnt = 0, sqr = sqrt(n);for(int i = 1; i <= sqr; i++){cnt += n / i;}return cnt * 2 - sqr * sqr;
}
signed main()
{cin >> l >> r;cout << f(r) - f(l - 1) << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/67934.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【Shiro】3.Springboot实现缓存

最近已经快速入门了Shiro。对于登录、授权、认证等方法,每次都是从数据库直接查询。如果登录的人员过多,对数据库来说,是一项压力。如何减轻数据库的压力。EhCache 实现缓存 集成 Redis 实现 Shiro 缓存(推荐使用)在此之前,我们已经简单学会EhCache 和Reids的使用。 EhCa…

织梦如何数据库备份,织梦cms网站数据怎么备份与还原

织梦CMS(DedeCMS)的数据库备份和还原是非常重要的操作,可以帮助你在出现问题时快速恢复数据。下面详细介绍如何进行织梦CMS的数据库备份和还原。 一、数据库备份 1. 使用 phpMyAdmin 备份数据库登录 phpMyAdmin登录到你的网站控制面板(如 cPanel)。 找到并打开 phpMyAdmin…

【软考】3 校验码

校验码 码距概念:任意进制的两个码值之间的最小二进制位数称为校验码的码距 例如:二进制1bit位,从0到1,则码距是1,二进制2bit位 从 00 到 11 一共4个码字,但码距还是为1 可以设置 性别男为 00 女为 11两个合法码字,则该两个合法码字的最小码距为2 (间隔 01 和 10 两个)…

IOU指标

IOU:全称 intersection over union 交并比,两个区域真实框和预测框之间的交集比他们之间的总面积-交集的 IOU指标:通常用于评估计算机视觉任务中的模型性能,特别是目标检测和图像分割。一个较高的IoU值意味着模型的定位和分割精度更好。

查找和管理数据库的具体步骤

登录MySQL命令行使用SSH连接到服务器。 登录MySQL命令行:bashmysql -u root -p输入MySQL root用户的密码。查看数据库列表在MySQL命令行中查看所有数据库:sqlSHOW DATABASES;选择织梦CMS数据库选择织梦CMS使用的数据库:sqlUSE dedecmsv56gbk;查看数据库表查看织梦CMS数据库中…

DedeCMS Error Track:DedeCMS错误警告:连接数据库失败

当织梦CMS(DedeCMS)出现“连接数据库失败”的错误时,可以通过以下几个步骤进行排查和解决: 1. 检查数据库配置文件打开配置文件打开织梦CMS的数据库配置文件 include/config.inc.php。 使用FTP工具或SSH连接到服务器,然后打开该文件。检查配置信息确认数据库配置信息是否正…

SpringMVC内容

SpringMVC简介 SpringMVC(Model View Controller) 是以Servlet API为基础的 Web 框架并可以部署到 Servlet容器(比如:Tomcat),是控制层框架,主要负责与前端交互,接收前端的参数,在服务层进行交互,并把结果返回会前端页面。 SpringMVC工作原理当发送请求的时候,Dis…

Linux系统安装Pycharm专业版【附破解方法】

​写在前面 本教程适用于 Pycharm 2022.2.3 以下所有版本 一、版本信息 虚拟机产品:VMware Workstation 17 Pro 虚拟机版本:17.0.0 build-20800274 ISO映像文件:ubuntukylin-22.04-pro-amd64.iso Pycharm版本:PyCharm 2022.3.3 (Professional Edition) 资源链接:https:/…