紫书 习题 10-13 UVa 11526(打表找规律+分步枚举)

首先看这道题目,我预感商数肯定是有规律的排列的,于是我打表找一下规律

100 / 1 = 100
100 / 2 = 50 
100 / 3 = 33 
100 / 4 = 25 
100 / 5 = 20 
100 / 6 = 16 
100 / 7 = 14 
100 / 8 = 12 
100 / 9 = 11 
100 / 10 = 10 
100 / 11 = 9  
100 / 12 = 8  
100 / 13 = 7  
100 / 14 = 7  
100 / 15 = 6  
100 / 16 = 6  
100 / 17 = 5  
100 / 18 = 5  
100 / 19 = 5  
100 / 20 = 5  
100 / 21 = 4  
100 / 22 = 4  
100 / 23 = 4  
100 / 24 = 4  
100 / 25 = 4  
100 / 26 = 3  
100 / 27 = 3  
100 / 28 = 3  
100 / 29 = 3  
100 / 30 = 3  
100 / 31 = 3  
100 / 32 = 3  
100 / 33 = 3  
100 / 34 = 2  
100 / 35 = 2  
100 / 36 = 2  
100 / 37 = 2  
100 / 38 = 2  
100 / 39 = 2  
100 / 40 = 2  
100 / 41 = 2  
100 / 42 = 2  
100 / 43 = 2  
100 / 44 = 2  
100 / 45 = 2  
100 / 46 = 2  
100 / 47 = 2  
100 / 48 = 2  
100 / 49 = 2  
100 / 50 = 2  
100 / 51 = 1  
100 / 52 = 1  
100 / 53 = 1  
100 / 54 = 1  
100 / 55 = 1  
100 / 56 = 1  
100 / 57 = 1  
100 / 58 = 1  
100 / 59 = 1  
100 / 60 = 1  
100 / 61 = 1  
100 / 62 = 1  
100 / 63 = 1  
100 / 64 = 1  
100 / 65 = 1  
100 / 66 = 1  
100 / 67 = 1  
100 / 68 = 1  
100 / 69 = 1  
100 / 70 = 1  
100 / 71 = 1  
100 / 72 = 1  
100 / 73 = 1  
100 / 74 = 1  
100 / 75 = 1  
100 / 76 = 1  
100 / 77 = 1  
100 / 78 = 1  
100 / 79 = 1  
100 / 80 = 1  
100 / 81 = 1  
100 / 82 = 1  
100 / 83 = 1  
100 / 84 = 1  
100 / 85 = 1  
100 / 86 = 1  
100 / 87 = 1  
100 / 88 = 1  
100 / 89 = 1  
100 / 90 = 1  
100 / 91 = 1  
100 / 92 = 1  
100 / 93 = 1  
100 / 94 = 1  
100 / 95 = 1  
100 / 96 = 1  
100 / 97 = 1  
100 / 98 = 1  
100 / 99 = 1  
100 / 100 = 1  


 

大家发现了什么?我发现很多商数都是大块大块地集中在一起的,而且集中的部分在除数大概为根号n到n之间(多打几个数就会发现)

也就是说这个部分的数字其实可以用一些比较巧妙的部分枚举出来。

所以我就有了一个想法,就这个数据而言,我们可以分两步枚举,第一步是枚举除数1~10,第二步是枚举商1~9来计算,复杂度是根号n

n最大为2的31次方-1, 根号之后是不会超时的

那么第一步直接就暴力就好了,关键是第二步怎么做

通过观察可以 ,发现100 / 1 = 100, 100 / 2 = 50, 100 / 3 = 33

然后在表中除数在100~51商是1,在50~34商是2……

所以我们可以算出“断点”,把除数分成一段一段的,每一段的商数是一样的。

所以我们可以统计每一段的长度,然后乘以商数更新答案

思路大致就是这样

 

还有一些细节需要注意

(1)枚举的边界问题

如这个数是完全平方数,那么可以除数从1到根号n,商数从1到(根号n) -1

如果不是的话,那么除数是1到根号n,商数也是1到根号n

举个例子可以发现,例如99这个数

根号99为9,在9(根号99)附近时这样的

99 / 9 = 11

99 / 10 = 9

所以如果不是完全平方数的话,两边都要枚举到根号n

(2)当n <= 0 时,要特判,直接输出0

因为按照题目那个程序的话n<=0时循环压根就不会进行,答案不会更新

(3)最后一个断点是根号n

例如

99 / 9 = 11

99 /10 = 9

99 / 11 = 9

99 / 12 = 8

最后一个数9的断点99 / 9 = 11是倒数第二个断点, 而除数到9就到了第一步枚举去了,

所以最后一个断点是9, 最后一段长度为 11 - 9 = 2

 

代码

#include<cstdio>
#include<cmath>
#include<vector>
#define REP(i, a, b) for(int i = (a); i < (b); i++) //注意是左闭右开
using namespace std;

typedef long long ll;
long long h(int n)
{
	ll ans = 0;
	int m = sqrt(n + 0.5); 
	REP(i, 1, m + 1) //第一步枚举除数,直接暴力
		ans += n / i;
		
	vector<int> g; 
	int t; //枚举边界问题 
	if(n % m == 0) t = m;
	else t = m + 1;
	
	REP(i, 1, m + 1) g.push_back(n / i); //加入“断点” 
	REP(i, 0, g.size() - 1)
		ans += (i + 1) * (g[i] - g[i+1]); //商乘上每一段的长度 
	ans += g.size() * (g[g.size() - 1] - m); //最后一个断点是根号n 
	
	return ans;
}

int main()
{
	int n, T;
	scanf("%d", &T);
	while(T--)
	{
		scanf("%d", &n);
		if(n <= 0) { puts("0"); continue; } //特判 
		printf("%lld\n", h(n));
	}	
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值