[GESP202312 五级] 平均分配

文章目录

  • 题目描述
  • 输入格式
  • 输出格式
  • 输入输出样例 #1
    • 输入 #1
    • 输出 #1
  • 输入输出样例 #2
    • 输入 #2
    • 输出 #2
  • 提交链接
  • 提示
  • 解析
  • 参考代码

题目描述

小杨认为,所有大于等于 a a a 的完全平方数都是他的超级幸运数。

小杨还认为,所有超级幸运数的倍数都是他的幸运数。自然地,小杨的所有超级幸运数也都是幸运数。

对于一个非幸运数,小杨规定,可以将它一直 + 1 +1 +1,直到它变成一个幸运数。我们把这个过程叫做幸运化。例如,如果 a = 4 a=4 a=4,那么 4 4 4 是最小的幸运数,而 1 1 1 不是,但我们可以连续对 1 1 1 3 3 3 + 1 +1 +1 操作,使其变为 4 4 4,所以我们可以说, 1 1 1幸运化后的结果是 4 4 4

现在,小杨给出 N N N 个数,请你首先判断它们是不是幸运数;接着,对于非幸运数,请你将它们幸运化。

输入格式

第一行 2 2 2 个正整数 a , N a, N a,N

接下来 N N N 行,每行一个正整数 x x x ,表示需要判断(幸运化)的数。

输出格式

输出 N N N 行,对于每个给定的 x x x ,如果它是幸运数,请输出 lucky,否则请输出将其幸运化后的结果。

输入输出样例 #1

输入 #1

2 4 
1 
4 
5 
9

输出 #1

4 
lucky 
8 
lucky

输入输出样例 #2

输入 #2

16 11 
1 
2 
4 
8 
16 
32 
64 
128 
256 
512
1024

输出 #2

16 
16 
16 
16 
lucky 
lucky 
lucky 
lucky 
lucky 
lucky 
lucky

提交链接

平均分配

提示

样例解释 1

虽然是完全平方数,但它小于 a a a,因此它并不是超级幸运数,也不是幸运数。将其进行 3 3 3 + 1 +1 +1 操作后,最终得到幸运数 4 4 4。4是幸运数,因此直接输出 lucky

5 5 5 不是幸运数,将其进行 3 3 3 + 1 +1 +1 操作后,最终得到幸运数 8 8 8

9 9 9 是幸运数,因此直接输出 lucky

数据规模

对于 30 % 30\% 30% 的测试点,保证 a , x ≤ 100 , N ≤ 100 a,x \le 100,N \le 100 a,x100,N100

对于 60 % 60\% 60% 的测试点,保证 a , x ≤ 1 0 6 a,x \le 10^6 a,x106

对于所有测试点,保证 a ≤ 1 , 000 , 000 a \le 1,000,000 a1,000,000;保证 N ≤ 2 × 1 0 5 N \le 2 \times 10^5 N2×105;保证 1 ≤ x ≤ 1 , 000 , 001 1 \le x \le 1,000,001 1x1,000,001

解析

此题的关键,找出:

  1. 找出所有超级幸运数:即大于等于 a a a 的完全平方数;

  2. 找出所有幸运数:所有超级幸运数及它们的倍数。

先考虑 30 % 30\% 30% 的数据。

此时的 a a a x x x 的最大范围为 100 100 100。我们可以暴力枚举一定范围,把这个范围内的完全平方数全部找到。 a ∼ 1000 a \sim 1000 a1000 这个范围一定是完全足够。

v i s [ ] vis[] vis[] 来标记幸运数
枚举完全平方数及其倍数

//判断一个数 是否为完全平方数
bool check(int x)
{int ave = sqrt(x);return ave * ave == x;
}vector<int>ans;  //存储 1e3 范围内的幸运数字
//只考虑1e3的数据 看能过多少测试点
for(int i = a; i <= Mx; i++)
{if(check(i)){if(!vis[i]){ans.push_back(i);vis[i] = true;//考虑1e3范围内的超级幸运数的倍数int rate = 2;while(rate * i <= Mx)  //考虑超级幸运数的倍数 {if(!vis[rate * i]){ans.push_back(rate * i);vis[rate * i] = true;}rate++;}}}
}

对于输入的 n n n 个数 x x x。若被标记则输出lucky,否则我们可以根据二分找到第一个大于 x x x 的位置输出。

sort(ans.begin() , ans.end());  //从小到大排序
for(int i = 1; i <= n; i++)
{if(vis[x[i]])cout << "lucky" << endl;else{int pos = upper_bound(ans.begin() , ans.end() , x[i]) - ans.begin();cout << ans[pos] << endl;}}

对于 100 % 100\% 100% 的数据。
a ≤ 1 , 000 , 000 a \le 1,000,000 a1,000,000 1 ≤ x ≤ 1 , 000 , 001 1 \le x \le 1,000,001 1x1,000,001

最极端的情况, x x x 1000001 1000001 1000001 a a a 1000000 1000000 1000000,若没有倍数的情况,大于 a a a 的最小的完全平方数为 1002001 1002001 1002001

我们可以借助 30 % 30\% 30% 数据的思路,对代码进行优化,分析时间复杂度。

平方数从 s q r t ( a ) sqrt(a) sqrt(a) 开始,最大的范围到 1002001 ( 1001 ∗ 1001 = 1002001 ) 1002001(1001 * 1001 = 1002001) 1002001(10011001=1002001)

for (int i = ceil(sqrt(a)); i <= 1001; i++)

对于每一个完全平方数我们依然选出其倍数进行存储。

// 能得出当x=1000001 最差的幸运数为1002001,1002001为完全平方数
for (int i = ceil(sqrt(a)); i <= 1001; i++)
{int x = i * i; // x为完全平方数for (int j = 1; j * x <= 1002001; j++){if (!vis[x * j])   //超级幸运数的倍数{ans.push_back(x * j);vis[x * j] = true;}}
}

此题的难点在于分析时间复杂度,考虑上述预处理代码的时间复杂度:

遍历从 a a a u p = 1002001 up = 1002001 up=1002001

  • 如果 i i i 是完全平方数,就遍历它的所有倍数 j = i , 2 i , 3 i , . . . , u p j = i, 2i, 3i, ..., up j=i,2i,3i,...,up,时间为 O ( u p / i ) O(up / i) O(up/i)

一共操作的次数: ∑ i 2 ≥ a u p u p i 2 \sum_{i^2≥a}^{\sqrt{up}} \frac{up}{i^2} i2aup i2up

化简后,求和为一个收敛常数,时间复杂度大约为 1 e 6 1e6 1e6 级别。

预处理后,对于每一个数 判断标记 + 二分 进行输出。

参考代码

#include <bits/stdc++.h>
using namespace std;bool vis[1100000];int main()
{int a, n;cin >> a >> n;vector<int> ans; // 存储幸运数字// 能得出当x=1000001 最差的幸运数为1002001,1002001为完全平方数for (int i = ceil(sqrt(a)); i <= 1001; i++){int x = i * i; // x为完全平方数for (int j = 1; j * x <= 1002001; j++){if (!vis[x * j])   //超级幸运数的倍数{ans.push_back(x * j);vis[x * j] = true;}}}sort(ans.begin() , ans.end());while (n--){int x;cin >> x;if (vis[x])cout << "lucky" << endl;else{int pos = upper_bound(ans.begin(), ans.end(), x) - ans.begin();cout << ans[pos] << endl;}}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Mysql]buffersize修改

1、找到my.cnf文件位置 ps -ef|grep mysqld 2、编辑my.cnf cd /etc/my.cnf.d vim my.cnf 一般修改为内存的50%~70% 3、重启服务 systemctl restart mysqld

清晰易懂的 Apollo 配置中心安装与使用教程

Apollo 是携程开源的分布式配置管理平台&#xff0c;支持配置实时推送、版本管理、权限控制等功能。本教程将手把手教你完成 Apollo 核心组件安装、基础配置管理及避坑指南&#xff0c;助你快速掌握企业级配置管理能力。 一、环境准备&#xff08;关键依赖&#xff09; 1. 基础…

PyTorch池化层详解:原理、实现与示例

池化层&#xff08;Pooling Layer&#xff09;是卷积神经网络中的重要组成部分&#xff0c;主要用于降低特征图的空间维度、减少计算量并增强模型的平移不变性。本文将通过PyTorch代码演示池化层的实现原理&#xff0c;并详细讲解最大池化、平均池化、填充&#xff08;Padding&…

如何构建并优化提示词?

提示词是一个小白最容易上手大模型的方式&#xff0c;提示词就是你告诉大模型应该如何去完成一项工作的系统性的命令&#xff0c;所以写一个好的提示词是比较关键的&#xff0c;那么如何写好一个提示词呢&#xff1f; 要写好提示词&#xff0c;其实就像我们要把一些命令清晰地传…

面向大模型的开发框架LangChain

这篇文章会带给你 如何使用 LangChain&#xff1a;一套在大模型能力上封装的工具框架如何用几行代码实现一个复杂的 AI 应用面向大模型的流程开发的过程抽象 文章目录 这篇文章会带给你写在前面LangChain 的核心组件文档&#xff08;以 Python 版为例&#xff09;模型 I/O 封装…

【蓝桥杯】动态规划:线性动态规划

1. 最长上升子序列(LIS) 1.1. 题目 想象你有一排数字,比如:3, 1, 2, 1, 8, 5, 6 你要从中挑出一些数字,这些数字要满足两个条件: 你挑的数字的顺序要和原来序列中的顺序一致(不能打乱顺序) 你挑的数字要一个比一个大(严格递增) 问:最多能挑出多少个这样的数字? …

vue2和vue3的主要区别

一、性能优化与响应式系统 性能优化&#xff1a; Vue2&#xff1a;性能较好&#xff0c;但在大型应用中&#xff0c;当数据变化频繁时可能出现性能瓶颈。它使用虚拟DOM来高效地进行DOM操作&#xff0c;并通过多种技术手段如懒加载、异步组件、树形抖动等优化性能。 Vue3&…

Python: 实现数据可视化分析系统

后端基于Python 开源的 Web 框架 Flask&#xff0c;前端页面采用 LayUI 框架以及 Echarts 图表&#xff0c;数据库为sqlite。系统的功能模块分为数据采集和存储模块、数据处理和分析模块、可视化展示模块和系统管理模块。情感分析方面使用LDA等主题建模技术&#xff0c;结合领域…

深度学习总结(3)

数据批量的概念 通常来说&#xff0c;深度学习中所有数据张量的第一个轴&#xff08;也就是轴0&#xff0c;因为索引从0开始&#xff09;都是样本轴[samples axis&#xff0c;有时也叫样本维度&#xff08;samples dimension&#xff09;​]​。深度学习模型不会一次性处理整个…

微软庆祝它成立整整50周年

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【操作系统(Linux)】——通过案例学习父子进程的线程异步性

本篇旨在通过几个案例来学习父子进程的线程异步性 一、父进程与子进程 我们将要做的&#xff1a; 创建父子进程&#xff0c;观察父子进程执行的顺序&#xff0c;了解进程执行的异步行为 源代码&#xff1a; #include <stdio.h> #include <sys/types.h> #include…

系统性能核心指标:QPS、TPS、RT、并发量详解

系统性能核心指标&#xff1a;QPS、TPS、RT、并发量详解 1. 引言 在分布式系统、高并发架构设计中&#xff0c;QPS、TPS、RT、并发量 等指标是衡量系统性能的关键。本文深入解析这些术语的定义、计算方法、关联性及优化策略&#xff0c;帮助开发者更好地进行系统性能评估与调…

PortswiggerLab:Exploiting a mass assignment vulnerability

实验目标 To solve the lab, find and exploit a mass assignment vulnerability to buy a Lightweight l33t Leather Jacket. You can log in to your own account using the following credentials: wiener:peter. 官方WP In Burps browser, log in to the application using…

卡尔曼滤波器的工作原理

原文: https://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/ 1 概述 你可以对某个动态系统有不确定信息的任何地方使用卡尔曼滤波器&#xff0c;并且对系统下一步的状态做出有根据的猜测。即使出现混乱的现实状态&#xff0c;卡尔曼滤波器都会给出一个合理的结果。…

PDFtk

如果下载的pdf文件有秘钥的话&#xff0c;使用下面linux命令去掉秘钥&#xff1a; pdftk 纳税记录.pdf input_pw 261021 output 纳税记录_output.pdf将多个单页pdf合并为一个pdf的linux命令: pdftk 自然人电子税务局1.pdf 自然人电子税务局2.pdf 自然人电子税务局3.pdf 自然人…

Openlayers:海量图形渲染之WebGL渲染

最近由于在工作中涉及到了海量图形渲染的问题&#xff0c;因此我开始研究相关的解决方案。我在网络上寻找相关的解决方案时发现许多的文章都提到利用Openlayers中的WebGLPointsLayer类&#xff0c;可以实现渲染海量的点&#xff0c;之后我又了解到利用WebGLVectorLayer类可以渲…

替换jeecg图标

替换jeecg图标 ant-design-vue-jeecg/src/components/tools/Logo.vue <!-- <img v-else src"~/assets/logo.svg" alt"logo">-->

Codeforces Round 970 (Div. 3)题解

题目地址 https://codeforces.com/contest/2008 锐评 本次D3的前四题还是比较简单的&#xff0c;没啥难度区分&#xff0c;基本上差不多&#xff0c;属于手速题。E的码量比F大一些&#xff0c;实现略显复杂一些。G的数学思维较明显&#xff0c;如果很久没有训练这个知识点&a…

操作系统:线程间同步之事件集

事件集是线程间同步的机制之一&#xff0c;一个事件集可以包含多个事件&#xff0c;利用事件集可以完成一对多、多对多的线程间同步。 目录 一、事件集举例说明 二、事件集工作机制 三、RT-Thread为实例说明 四、事件集的应用场合 一、事件集举例说明 以坐公交车为例&…

基于springboot钻孔数据管理系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 本钻孔数据管理系统采用B/S架构&#xff0c;数据库是MySQL&#xff0c;网站的搭建与开发采用了先进的Java语言、Hadoop、数据可视化技术进行编写&#xff0c;使用了Spring Boot框架。该系统从两个对象&#xff1a;由管理员和用户来对系统进行设计构建。用户主要功能包括&…