小苯的排列构造(最大公约数,构造,数学推导)

文章目录

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

题目描述

格格有一个长度为 n n n 的排列 p p p,但她不记得 p p p 具体的样子,她只记得数组 a a a

其中: a i = g c d ( p 1 , p 2 , . . . , p i ) a_i=gcd(p_1,p_2,...,p_i) ai=gcd(p1,p2,...,pi),也就是说, a i a_i ai​ 表示排列 p p p 中前 i i i 个数字的最大公约数。

现在,她希望小苯将排列 p p p 复原出来,请你帮帮他吧。

(但有可能无解,这意味着格格给出的 a a a 数组可能是不正确的,此时输出 − 1 −1 1 即可。)

输入格式

输入包含两行。

第一行一个正整数 n ( 1 ≤ n ≤ 2 × 1 0 5 ) n (1≤n≤2×10^5) n(1n2×105),表示数组 a a a 的长度。

第二行 n n n 个正整数 a i ( 1 ≤ a i ≤ n ) a_i (1≤a_i≤n) ai(1ain),表示数组 a a a 的元素。

输出格式

输出包含一行 n n n 个正整数,表示符合条件的排列 p p p

如果有多个解,输出任意方案即可。

如果无解,请输出一个数字: − 1 −1 1

样例输入1

4
4 2 1 1

样例输出1

4 2 1 3

提交链接

https://ac.nowcoder.com/acm/contest/82957/D

提示

排列:长度为 n n n 的排列是一个数组,满足其中 1 1 1 n n n 的每个正整数恰好出现一次。

样例解释:

首先输出是一个排列,且满足格格的要求:

a 1 = g c d ( p 1 ) = 4 a_1=gcd(p_1)=4 a1=gcd(p1)=4

a 2 = g c d ( p 1 , p 2 ) = 2 a_2=gcd(p_1,p_2)=2 a2=gcd(p1,p2)=2

a 3 = g c d ( p 1 , p 2 , p 3 ) = 1 a_3=gcd(p_1,p_2,p_3)=1 a3=gcd(p1,p2,p3)=1

a 4 = g c d ( p 1 , p 2 , p 3 , p 4 ) = 1 a_4=gcd(p_1,p_2,p_3,p_4)=1 a4=gcd(p1,p2,p3,p4)=1

解析

根据 a [ i ] = g c d ( p [ 1 ] , . . . , p [ i ] ) a[i]=gcd(p[1],...,p[i]) a[i]=gcd(p[1],...,p[i]) a [ i − 1 ] = g c d ( p [ 1 ] , . . . , p [ i − 1 ] ) a[i-1]=gcd(p[1],...,p[i-1]) a[i1]=gcd(p[1],...,p[i1]),即 a [ i ] = g c d ( a [ i − 1 ] , p [ i ] ) a[i]=gcd(a[i-1],p[i]) a[i]=gcd(a[i1],p[i])

可以得到 a [ i − 1 ] % a [ i ] = 0 a[i-1]\%a[i]=0 a[i1]%a[i]=0

即, a a a 数组递减的,且满足 a [ i − 1 ] % a [ i ] = 0 a[i-1]\%a[i]=0 a[i1]%a[i]=0 a [ i − 1 ] = a [ i ] a[i-1]=a[i] a[i1]=a[i]

确定 a n s ans ans 数组,分为两种情况。

  1. a [ i − 1 ] > a [ i ] a[i-1]>a[i] a[i1]>a[i]
    a n s ans ans 数组的第 i i i 个位置填 a [ i ] a[i] a[i]

    证明:
    a [ i − 1 ] = g c d ( a n s [ 1 ] , . . . , a n s [ i − 1 ] ) > a [ i ] = g c d ( a n s [ 1 ] , . . . , a n s [ i ] ) a[i-1]=gcd(ans[1],...,ans[i-1])>a[i]=gcd(ans[1],...,ans[i]) a[i1]=gcd(ans[1],...,ans[i1])>a[i]=gcd(ans[1],...,ans[i]) = > => =>
    m i n ( a n s [ 1 ] , . . , a n s [ i − 1 ] ) > m i n ( a n s [ 1 ] , . . . , a n s [ 1 ] ) min(ans[1],..,ans[i-1])>min(ans[1],...,ans[1]) min(ans[1],..,ans[i1])>min(ans[1],...,ans[1]) = > => =>
    a n s [ 1 ] ∼ a n s [ i − 1 ] ans[1] \sim ans[i-1] ans[1]ans[i1] a n s [ i ] ans[i] ans[i] 不相等, a [ i ] a[i] a[i] 未使用。又要保证 a n s [ 1 ] ∼ a n s [ i ] ans[1] \sim ans[i] ans[1]ans[i] 的最大公约数为 a [ i ] a[i] a[i],则 a n s [ i ] = a [ i ] ans[i]=a[i] ans[i]=a[i]

  2. a [ i − 1 ] = a [ i ] a[i-1]=a[i] a[i1]=a[i]
    a n s [ i ] ans[i] ans[i] 数组的第 i i i 个位置填 a [ i ] a[i] a[i] 未使用的倍数。

a [ i ] = g c d ( a n s [ 1 ] , . . , a n s [ i ] ) a[i]=gcd(ans[1],..,ans[i]) a[i]=gcd(ans[1],..,ans[i]),可以得到 a n s [ i ] ans[i] ans[i] a [ i ] a[i] a[i] 的倍数, a n s [ i − 1 ] ans[i-1] ans[i1] a [ i ] a[i] a[i] 的倍数。

我们可以这样构造: a [ i ] a[i] a[i] 的倍数从小到大使用。即当填 a n s ans ans 数组的第 i i i 个位置时,小于等于 a n s [ i − 1 ] ans[i-1] ans[i1] a [ i ] a[i] a[i] 的倍数都已经被使用。
我们可以从 a n s [ i − 1 ] + a [ i ] ans[i-1]+a[i] ans[i1]+a[i] 开始找 a [ i ] a[i] a[i] 的倍数,大大减少时间复杂度。

参考代码

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 9;
int n, a[maxn], ans[maxn];
bool vis[maxn];
int main()
{cin >> n;for (int i = 1; i <= n; i++)cin >> a[i];bool book = false;for (int i = 1; i <= n; i++){if (i >= 2 && a[i - 1] % a[i] != 0)  //a数组必须满足 a[i-1] % a[i] = 0{book = true;break;}}if (!book){for (int i = 1; i <= n; i++){if (a[i - 1] != a[i])ans[i] = a[i];else{for (int k = ans[i - 1] + a[i]; k <= n; k += a[i]) // 找a[i]的倍数{if (!vis[k]){ans[i] = k;break;}}}if (!ans[i]){book = true;break;}vis[ans[i]] = true;}}if (book)cout << -1;else{for (int i = 1; i <= n; i++)cout << ans[i] << " ";}return 0;
}

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

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

相关文章

【网络技术】【Kali Linux】Wireshark嗅探(十五)SSDP(简单服务发现协议)报文捕获及分析

往期 Kali Linux 上的 Wireshark 嗅探实验见博客&#xff1a; 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;一&#xff09;ping 和 ICMP 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;二&#xff09;TCP 协议 【网络技术】【Kali Linux】Wireshark嗅探&…

与MySQL DDL 对比分析OceanBase DDL的实现

本文将简要介绍OceanBase的DDL实现方式&#xff0c;并通过与MySQL DDL实现的对比&#xff0c;帮助大家更加容易理解。 MySQL DDL 的算法 MySQL 的DDL实现算法主要有 copy、inplace和instant。 copy copy算法的实现相对简单&#xff0c;MySQL首先会创建一个临时表&#xff0…

C++:STL

STL 文章目录 STLSTL 绪论迭代器&#xff08;iterators&#xff09;容器&#xff08;Containers&#xff09;vectorset,multisetmap,multimapstackqueuedequepriority_queuebitset 算法&#xff08;Algorithms&#xff09;sort,count,find,lower_bound,upper_bound,binary_sear…

(2024,attention,可并行计算的 RNN,并行前缀扫描)将注意力当作 RNN

Attention as an RNN 公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 注意力作为一种&#xff08;多对一的&#xff09;RNN 3.2 注意力作为&#xff08;多对多&…

多语言印度红绿灯系统源码带三级分销代理功能

前端为2套UI&#xff0c;一套是html写的&#xff0c;一套是编译后的前端 后台功能很完善&#xff0c;带预设、首充返佣、三级分销机制、代理功能。 东西很简单&#xff0c;首页就是红绿灯的下注页面&#xff0c;玩法虽然单一&#xff0c;好在不残缺可以正常跑。

Putty: 随心御剑——远程启动服务工具plink

一、引言:如何远程控制 也许你会有这样的场景,交互程序(以下简称UI程序)跑在windows端,而控制程序跑在Linux上。我们想要通过windows端 UI程序来启动Linux下面的服务,来一场酣畅淋漓的御剑飞行咋办,难道要自己十年磨一剑,在Linux下编写一个受控服务程序么.计算机科技发…

【MATLAB】信号的熵

近似熵、样本熵、模糊熵、排列熵|、功率谱熵、奇异谱熵、能量熵、包络熵 代码内容&#xff1a; 获取代码请关注MATLAB科研小白的个人公众号&#xff08;即文章下方二维码&#xff09;&#xff0c;并回复信号的熵本公众号致力于解决找代码难&#xff0c;写代码怵。各位有什么急需…

FreeRTOS中断中释放信号量

串口接收&#xff1a;中断程序中逆序打印字符串 串口接收&#xff1a;逆序回环实验思路 注&#xff1a;任务优先级较高会自动的切换上下文进行运行 FreeRTOS中的顶半操作和底半操作 顶半操作和底半操作“这种叫法源自与Linux”在嵌入式开发中&#xff0c;为了和Linux操作系统做…

kafka 案例

kafka 案例 目录概述需求&#xff1a; 设计思路实现思路分析1.kafka案例_API 带回调函数的生产者2.kafka案例_API生产者分区策略测试3.kafka案例_自定义分区的生产者4.kafka案例_API同步发送生产者5.kafka案例_API简单消费者5.kafka案例_API消费者重置offset 参考资料和推荐阅读…

Linux网络编程: 网络基础

Linux网络编程: 网络基础 1.网络划分 一.网络通信1.网络通信和本地通信的联系2.网络通信与本地通信最本质的区别及其衍生出的问题 二.网络协议初识1.为何本地通信不行&#xff1f;2.打电话的例子体会分层模型的好处3.OSI七层模型的提出4.OSI七层模型与TCP/IP五层模型1.TCP/IP与…

二十九篇:构建未来:信息系统的核心框架与应用

构建未来&#xff1a;信息系统的核心框架与应用 1. 引言 在这个充满挑战和机遇的信息时代&#xff0c;信息系统已经成为现代组织不可或缺的神经中枢。它们不仅革新了我们处理信息的方式&#xff0c;更是极大地增强了决策制定的效率和质量。在这篇文章中&#xff0c;我将分享我…

php 一个数组中的元素是否在一个字符串中包含

php 一个数组中的元素是否在一个字符串中包含 要检查一个数组中的元素是否在一个字符串中出现&#xff0c;你可以使用strpos()函数。这个函数返回子字符串首次出现的位置索引&#xff0c;如果没有找到&#xff0c;它会返回false。 $array [apple, banana, cherry]; $string …

Java进阶-SpringCloud使用BeanUtil工具类简化对象之间的属性复制和操作

在Java编程中&#xff0c;BeanUtil工具类是一种强大且便捷的工具&#xff0c;用于简化对象之间的属性复制和操作。本文将介绍BeanUtil的基本功能&#xff0c;通过详细的代码示例展示其应用&#xff0c;并与其他类似工具进行对比。本文还将探讨BeanUtil在实际开发中的优势和使用…

有效的字母异位词-力扣

看到题目首先想到的解法是使用unordered_map容器来做&#xff0c;遍历第一个字符串&#xff0c;统计每个char出现的次数&#xff0c;然后遍历第二个字符串&#xff0c;出现一个char&#xff0c;map对应值就减一&#xff0c;最后判断map容器所有键值是否为0&#xff0c;如果全部…

5.26牛客循环结构

1002. 难点&#xff1a; 两层循环条件设置 思路 可以设置三个变量 代码 1003 思路&#xff1a; 与星号双塔差不多&#xff0c;在此基础上加大一点难度 每日练题5.23 &#xff08;EOF用法&#xff09;-CSDN博客 代码 1004 代码

Android Compose 八:常用组件 Switch

Switch 切换按钮 val isChecked remember { mutableStateOf(true) }Switch(checked isChecked.value,onCheckedChange {Log.i("text_compose","onCheckedChange>>"it)isChecked.value it})效果 默认颜色 应该对应 主题色 1.1 thumbContent 按钮…

mapreduce综合应用案例 — 招聘数据清洗

MapReduce是一种编程模型&#xff0c;用于处理和生成大数据集。它通过Map和Reduce两个步骤来实现数据的分布式处理。在招聘数据清洗的场景中&#xff0c;MapReduce可以用来处理大规模的招聘数据集&#xff0c;以提取、清洗和转换数据&#xff0c;为进一步的分析和决策提供支持。…

Python Beautiful Soup 使用详解

大家好&#xff0c;在网络爬虫和数据抓取的领域中&#xff0c;Beautiful Soup 是一个备受推崇的 Python 库&#xff0c;它提供了强大而灵活的工具&#xff0c;帮助开发者轻松地解析 HTML 和 XML 文档&#xff0c;并从中提取所需的数据。本文将深入探讨 Beautiful Soup 的使用方…

vue项目打包教程

如果是用 vue-cli 创建的项目&#xff0c;则项目目录中没有 config 文件夹&#xff0c;所以我们需要自建一个配置文件&#xff1b;在vue项目目录下创建文件 vue.config.js&#xff0c;需注意文件名称必须是 vue.config.js&#xff0c;然后在文件中插入以下代码&#xff1a; 文件…

我让gpt4o给我推荐了一千多次书 得到了这些数据

事情是这样的&#xff0c;我们公司不是有个读书小组嘛&#xff0c;但是今年大家都忙于工作&#xff0c;忽视了读书这件事&#xff0c;所以我就想着搞个群机器人&#xff0c;让它明天定时向群里推荐一本书&#xff0c;用来唤起大家对读书的兴趣。但在调试的过程中就发现gpt4o老喜…