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

这个题其实只需要考虑一件事:记答案数组为 \(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. GooseFS 在云端数据湖存储上的降本增效实践

    ​ | 导语 基于云端对象存储的大数据和数据湖存算分离场景已经被广泛铺开,计算节点的独立扩缩容极大地优化了系统的整体运行和维护成本,云端对象存储的无限容量与高吞吐也保证了计算任务的高效和稳定.然而,云 ...

  2. 技术漫谈|IVR通用开发框架简说

    IVR为Interactive Voice Response的缩写,意为交互式语音应答(系统).它可以应答客户的呼叫,然后为呼叫者提供语音导航或自助服务,呼叫者可通过按键输入或使用语音命令进行选择.随 ...

  3. Anaconda功能、优点、安装步骤(安装视频)

    目录 介绍 功能(包和环境的管理器) 优点(省时省心) 下载地址 安装教程 要点 conda 的常见命令 查询完整帮助文件 管理conda和anaconda 管理环境 包管理 其他 ​ 介绍 Anac ...

  4. Unity 3D简单使用C#脚本,脚本的执行顺序

    Unity3D脚本间执行顺序 Unity3D中一个场景有时候需要多个脚本,可以挂在同一物体上执行,也可以挂在不同物体上执行 那么执行顺序是怎样的?我们来测试下 在上个项目基础上,再建一个Test2脚本 ...

  5. Qt/C++音视频开发49-多级连保存和推流设计(同时保存到多个文件/推流到多个平台)

    一.前言 近期遇到个用户需要多级联的保存和推流,在ffmpegsave多线程保存类中实现这个功能,越简单越好,就是在推流的同时,能够开启自动转储功能,一边推流的同时一边录像保存到本地视频文件.最初设想 ...

  6. Qt控件SDK使用示例大全

    文章 链接 01表盘控件-01汽车仪表盘-gaugecar https://qtchina.blog.csdn.net/article/details/120240257 01表盘控件-02圆弧仪表盘 ...

  7. [转]C# 组合查询条件

    在我们开发过程中经常会遇见一些通过条件获取数据的功能,比如说获取我们的用户信息,查询输入框有用户姓名,部门,入职年份等等,但查询时可能只输入一个条件或多个条件,像这种不确定的查询时,我们应该如何处理. ...

  8. IM通讯协议专题学习(三):由浅入深,从根上理解Protobuf的编解码原理

    本文由码农的荒岛求生陆小风分享,为了提升阅读体验,进行了较多修订和排版. 1.引言 搞即时通讯IM方面开发的程序员,在谈到通讯层实现时,必然会提到网络编程.那么计算机网络编程中的一个非常基本的问题:到 ...

  9. DVWA靶场Insecure CAPTCHA(不安全验证)漏洞所有级别通关教程及源码审计

    Insecure CAPTCHA(不安全验证) Insecure CAPTCHA(不安全验证)漏洞指的是在实现 CAPTCHA(完全自动化公共图灵测试区分计算机和人类)机制时,未能有效保护用户输入的验 ...

  10. HTTP协议超级详解【转载】

    HTTP协议简介 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式.协作式和超媒体信息系统的应用层协议.HTTP是万维网的数据通信的基础. ...