力扣 3266. K 次乘运算后的最终数组 II

news/2024/12/14 20:45:50/文章来源:https://www.cnblogs.com/th19/p/18607166

发现 \(k\le10^9\),肯定不能直接模拟了。但是注意到,如果最小值 \(\min\times m>\max\) 存在,我们可以直接给每个数乘上 \(m^{\lfloor\frac{k}{n}\rfloor}\),最后再处理剩下的 \(k\bmod n\)\(m\) 即可,这个复杂度是 \(O(n)\) 的。具体地说,

  • 最小值乘上一个 \(m\) 超过最大值之后,其他的数也可以乘一个 \(m\) 超过最大值。
  • 因为 \(\min<\max\),所以最大值只乘一个 \(m\) 又能成为最大值。
  • 因为 \(\min\times m>\max\),所以 \(\min\times m^2>\max\times m\),最小值又可以通过乘一个 \(m\) 超过最大值……

这个过程可以继续进行下去,直到 \(k\) 不够用。

那么什么时候 \(\min\times m>\max\) 成立呢?发现这个条件随着不断模拟 \(\min\times m\) 是一定能达到的,而且步数并不多。\(nums_i\le 10^9\)\(m\) 取最小值 \(2\),也只需要乘 \(31\) 次就能达到;最多 \(n-1\) 个数每个乘 \(31\) 次,也不会超时。

所以一开始直接小根堆模拟,达到 \(\min\times m>\max\) 后用快速幂批量处理,最后剩下的部分继续模拟完即可。

using LL = long long;
const int MOD = 1'000'000'007;
LL power(LL a, LL n); // 快速幂(略)vector<int> getFinalState(vector<int>& nums, int k, int m) {if (m == 1) {return move(nums);}int n = nums.size();int mx = ranges::max(nums);vector<pair<LL, int>> v(n);for (int i = 0; i < n; i++) {v[i] = {nums[i], i};}ranges::make_heap(v, greater{}); // 小根堆for (; k && v[0].first < mx; k--) {(ranges::pop_heap(v, greater{}) - 1)->first *= m; // 取堆头,放到尾部ranges::push_heap(v, greater{}); // 最后一个元素入堆(一般配合push_back)}LL p1 = power(m, k / n); // 后面的乘 m^(k/n)LL p2 = p1 * m % MOD; // 前 k%n 个乘 m^(k/n+1)ranges::nth_element(v, v.begin() + k % n); // 前 k 小放到前面,比 sort 快for (int i = 0; i < n; i++) {auto& [x, j] = v[i];nums[j] = x % MOD * (i < k % n ? p2 : p1) % MOD;}return move(nums);
}

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

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

相关文章

locust 压力测试工具windows平台从零开始安装使用

locust是一个用python写的接口压力测试应用,我们只需要编写简单的代码才能运行测试,前期安装需要一点python基础。 用以测试的接口需要一个一个通过代码添加,如下: 这就是一个测试的接口了,很简单,只需要接口的路径和参数,接口的主机地址会在web端输入: locust需要pyth…

OpenDaylight下发流表

实验一:单流表(v1.0) 下发流表实现h1和h2之间不能互通。 1、启动OpenDaylight ./karaf查看6633端口是否处于监听状态 netstat -an | grep 6633在物理机浏览器中访问虚拟机ip:8181/index.html登录OpenDaylight网页端。 账号密码都是admin。后面做实验的时候,出现过无法登录的…

深度学习入门笔记——神经网络的构建和使用

神经网络的整体构建 神经网络的基本骨架 首先可以在Pytorch官网的Python API中查看torch.nn的使用,如下所示。可以看到神经网络包括Container(基本骨架)、卷积层、池化层、Padding层、非线性激活等等。 构建一个神经网络首先要先构建起基本骨架,也就是Containersnn.Moudle的…

计算机做的所有事情都叫计算

计算机怎么解决问题?答:需要告诉计算机解决问题的步骤(不要写成说明书了) 怎么告诉计算机这个步骤?答:编程语言写程序 1. 写程序不是表达关系,是表达动作2. 是解决问题的步骤,编程的时候不是你说一句它做一句3. 编程语言不是用来和计算机交流的4. 计算机的交流是你的操…

第四章 文件管理

文件 4.1.1 文件的基本概念文件是指由创建者所定义的、具有文件名的一组相关元素的集合,是以硬盘为载体的存储在计算机上的信息集合 是文件系统中最大的数据单位 在用户进行的输入,输出中,则以文件为基本单位4.1.5 文件的逻辑结构 按文件是否有结构分类 无结构文件 文件内部…

程序执行两种方式

1.你写的程序交文件给它,它一步步按照你的要求执行 2.写的程序文件交给它,它翻译成计算机懂的文件,用计算机懂的文件执行 解释语言vs编译语言1. 语言本身没有解释和编译的区分,任何语言都可以编译执行和解释执行。2. 只是语言常用执行方式的传统和习惯的问题3. 解释语言 特…

P1070 [NOIP2009 普及组] 道路游戏

ProblemSolve 此题是求最优解,考虑贪心时会发现这个不满足局部最优->整体最优,故考虑DP 通过输入格式能受到启发,时间可以作为维度之一,所以定义为: \(f_{i,j}\)第i秒末,机器人在j号工厂能获得的最大金币 因为机器存在时间有上限,所以推的时候枚举本次机器人到底走了多…

2024-12-14:K 周期字符串需要的最少操作次数。用go语言,给定一个长度为n的字符串 word 和一个整数k,k是n的因数。每次操作可以选择两个下标i和j,使得i和j都可以被k整除,然后用从j

2024-12-14:K 周期字符串需要的最少操作次数。用go语言,给定一个长度为n的字符串 word 和一个整数k,k是n的因数。每次操作可以选择两个下标i和j,使得i和j都可以被k整除,然后用从j开始的长度为k的子串替换从i开始的长度为k的子串。要使得word成为一个K周期字符串,需要进行…

实现综合实例:简单文字处软件 (一)

学业繁重,更新缓慢。 本内容主要用于个人学习/复习QT简单入门控件 DAY ONE 创建项目界面设计与开发 实现简单的菜单栏设计本人并没有使用代码实现,而是用于使用UI设计师界面。action条例分类 设计控件(帮助) 设计帮助控件: 我们转到槽,填写如下代码: 这是一个基于QT6实现…

微信防撤回插件

插件 https://pan.quark.cn/s/bb5165185a6a部署 先查看电脑微信版本,比如我这里是3.9.12.15版本下载对应版本之后,将插件名字改为WeChatWin.dll,删掉前面的版本号在微信所在的文件夹下,找到这个同名插件,用下载的插件替换它即可 end 替换之后需要重启微信才可以,效果如下…

事务管理与锁机制

title: 事务管理与锁机制 date: 2024/12/14 updated: 2024/12/14 author: cmdragon excerpt: 在数据库系统中,事务管理至关重要,它确保多个数据库操作能够作为一个单一的逻辑单元来执行,从而维护数据的一致性和完整性。一个良好的事务管理系统能够解决并发操作带来的问题,…