思路(贪心 + 唯一分解定理)

这个题其实只需要考虑一件事:记答案数组为 \(a\),对于两个不同下标 \(i\) 和 \(j\),当 \(\gcd(i,j) = \min(i,j)\) 时,我们只需要让 \(a_{\max(i,j)} < a_{\min(i,j)}\) 即可。

证明:任意两个数 \(x,y\),一定有 \(\gcd(x,y) \leq \min(x,y)\)。

第一种情况,如果 \(\gcd(i,j) = \min(i,j)\),显而易见按上述构造是满足题意的,因为 \(a_{\gcd(i,j)} = a_{\min(i,j)} = \max(a_i,a_j) \neq \gcd(a_i,a_j)\)。

第二种情况,如果 \(\gcd(i,j) \neq \min(i,j)\),那么 $\gcd(i,j) < \min(i,j) $,记 \(c = \gcd(i,j)\),则 \(\gcd(i,c) = c\) 并且 \(\gcd(j,c) = c\),此时问题转化为第一种情况。

证毕。

答案要最大字典序,那首先就把原集合元素从大到小排列来贪心求解。

对 \(1\) 到 \(n\) 中的每一个答案数组下标唯一分解一下,记当前下标为 \(i\),分解出来的素数为 \(k\)。

因为除掉的数越少,前置下标包含的因子一定越多,求得的答案肯定越能满足前面所有的下标。

所以只需要对每一个答案数组下标用除掉一个素数的前置下标来转移就行了。

我们用 \(ans_i\) 来表示答案数组下表为 \(i\) 的位置的对应的集合中的元素下标,则有转移方程 \(ans_i = \max\{ans_{i / k} + 1\}\)。

而这个过程可以直接预处理,因为我们只需要得到每一个答案数组的下标对应的一个集合内部的下标。

时间复杂度:\(O(n\sqrt{n})\)。

AC CODE

#include <bits/stdc++.h>
#define int long long
#define inf 2e18
#define ull unsigned long long
#define ls o << 1
#define rs o << 1 | 1 using namespace std; const int N = 1e5 + 9;
int a[N];
int ans[N];
int n, m; bool check()
{
for(int i = 1;i <= n;i ++)
if(ans[i] > m)return false;//只要下标超出了集合的大小,就无解
return true;
} void solve()
{
cin >> n >> m;
for(int i = 1;i <= m;i ++)cin >> a[i];
reverse(a + 1, a + m + 1);//将集合元素从大到小排列 if(check())
{
for(int i = 1;i <= n;i ++)cout << a[ans[i]] << " \n"[i == n];
}
else cout << -1 << '\n';
} void init()//预处理每个答案数组的下标对应的集合下标
{
ans[1] = 1;
for(int i = 2;i < N;i ++)
{
int tmp = i;
for(int j = 2;j * j <= tmp;j ++)
{
if(tmp % j == 0)
{
ans[i] = max(ans[i], ans[i / j] + 1);
while(tmp % j == 0)tmp /= j;
}
} if(tmp > 1)ans[i] = max(ans[i], ans[i / tmp] + 1);
}
} signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); init(); int t = 1;cin >> t;
while(t --)solve(); return 0;
}

CF2039D Shohag Loves GCD的更多相关文章

  1. CA Loves GCD (BC#78 1002) (hdu 5656)

    CA Loves GCD  Accepts: 135  Submissions: 586  Time Limit: 6000/3000 MS (Java/Others)  Memory Limit: ...

  2. HDU 5656 CA Loves GCD (数论DP)

    CA Loves GCD 题目链接: http://acm.hust.edu.cn/vjudge/contest/123316#problem/B Description CA is a fine c ...

  3. 数学(GCD,计数原理)HDU 5656 CA Loves GCD

    CA Loves GCD Accepts: 135 Submissions: 586 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 2621 ...

  4. CA Loves GCD

    Problem Description CA is a fine comrade who loves the party and people; inevitably she loves GCD (g ...

  5. hdu 5656 CA Loves GCD(n个任选k个的最大公约数和)

    CA Loves GCD  Accepts: 64  Submissions: 535  Time Limit: 6000/3000 MS (Java/Others)  Memory Limit: 2 ...

  6. HDU 5656 CA Loves GCD 01背包+gcd

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5656 bc:http://bestcoder.hdu.edu.cn/contests/con ...

  7. HDU 5656 CA Loves GCD dp

    CA Loves GCD 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5656 Description CA is a fine comrade w ...

  8. HDU 5656 ——CA Loves GCD——————【dp】

    CA Loves GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)To ...

  9. hdu-5656 CA Loves GCD(dp+数论)

    题目链接: CA Loves GCD Time Limit: 6000/3000 MS (Java/Others)     Memory Limit: 262144/262144 K (Java/Ot ...

  10. hdu 5656 CA Loves GCD

    CA Loves GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)To ...

随机推荐

  1. Postgresql使用触发器实现同步插入两张表

    在有一个陈旧的系统的情况下,如果升级API可以优先使用微服务的形式,将数据库进行独立拆分,将原来的数据库原原本本地固定在旧系统中,然后在独立的微服务中运行与部署新系统. 如果原有的数据需要在更换结构的 ...

  2. Qt采集本地摄像头推流成rtsp/rtmp(可网页播放/支持嵌入式linux)

    一.功能特点 支持各种本地视频文件和网络视频文件. 支持各种网络视频流,网络摄像头,协议包括rtsp.rtmp.http. 支持将本地摄像头设备推流,可指定分辨率和帧率等. 支持将本地桌面推流,可指定 ...

  3. .Net程序员机会来了,微软官方新推出一个面向Windows开发者本地运行AI模型的开源工具

    想要开发AI产品的.Net程序员机会来了,这个项目应该好好研究. 虽然说大模型基本都有提供网络API,但肯定没有直接使用本地模型速度快. 最近微软官方新推出AI Dev Gallery开源项目,可以帮 ...

  4. Verilog6_串行通信协议

    一.通信协议概述 1.串行通信与并行通信 串行通信(serial communication):数据通过单根数据线一位一位地传输:成本低但速度慢:适用于远距离传输,用于计算机与外设之间,如UART.\ ...

  5. Linux环境python3-pip安装指定源地址

    # 新建配置文件 vim ~/.pip/pip.conf # 写入地址 [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple [i ...

  6. 2025-01-08:找到按位或最接近 K 的子数组。用go语言,给定一个数组 nums 和一个整数 k,你的目标是找到一个子数组,使得该子数组中所有元素进行按位或运算后的结果与 k 之间的绝对差值尽

    2025-01-08:找到按位或最接近 K 的子数组.用go语言,给定一个数组 nums 和一个整数 k,你的目标是找到一个子数组,使得该子数组中所有元素进行按位或运算后的结果与 k 之间的绝对差值尽 ...

  7. Mongodb 基础与安装

    官网链接:https://docs.mongodb.com/ 参考链接:https://www.runoob.com/mongodb/mongodb-linux-install.html 1.什么是M ...

  8. ClickHouse-2接口

    客户端 ClickHouse提供了两个网络接口(两个都可以选择包装在TLS中以增加安全性): HTTP, 包含文档,易于使用. Native TCP,简单,方便使用. 在大多数情况下,建议使用适当的工 ...

  9. RSA的原理和简单实践

    RSA加密是一种非对称加密,原理是: 使⽤算法可以⽣成两把钥匙 A 和 B 使⽤ A 加密的信息,使⽤ B 可以解开 使⽤ B 加密的信息,使⽤ A 可以解开 ⽇常使⽤中,我们把⼀把作为公钥公开发布. ...

  10. linux:配置NTP

    介绍 网络时间协议(Network Time Protocol,NTP),用于同步网络中各个计算机的时间的协议.其用途是将计算机的时钟同步到世界协调时 UTC. ntpd(Network Time P ...