CF2039D Shohag Loves GCD
思路(贪心 + 唯一分解定理)
这个题其实只需要考虑一件事:记答案数组为 \(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的更多相关文章
- CA Loves GCD (BC#78 1002) (hdu 5656)
CA Loves GCD Accepts: 135 Submissions: 586 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: ...
- 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 ...
- 数学(GCD,计数原理)HDU 5656 CA Loves GCD
CA Loves GCD Accepts: 135 Submissions: 586 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 2621 ...
- CA Loves GCD
Problem Description CA is a fine comrade who loves the party and people; inevitably she loves GCD (g ...
- hdu 5656 CA Loves GCD(n个任选k个的最大公约数和)
CA Loves GCD Accepts: 64 Submissions: 535 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 2 ...
- 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 ...
- 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 ...
- HDU 5656 ——CA Loves GCD——————【dp】
CA Loves GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)To ...
- hdu-5656 CA Loves GCD(dp+数论)
题目链接: CA Loves GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Ot ...
- hdu 5656 CA Loves GCD
CA Loves GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)To ...
随机推荐
- 配合 envoy 使用 Zipkin
use zipkin in envoy document: https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/zipkin.htm ...
- 证书签名算法OID.1.2.156.10197.1.501
证书签名算法OID.1.2.156.10197.1.501 证书签名算法OID为1.2.156.10197.1.501表示该证书使用的是基于SM3的SM2签名算法 1.SM2证书数据和RSA算法证 ...
- shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行.如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set +e 命令来取消该设置. 例如,下面是一个忽略错误并继 ...
- tar/zip命令加密压缩
回到顶部 场景 Centos6下使用加密压缩,可以从A机器到B机器解压. 可用在kali上解压就不行. 回到顶部 命令 解包 tar zxvf FileName.tar 打包 tar czvf Fil ...
- 3款.NET开源、功能强大的通讯调试工具,效率提升利器!
前言 今天大姚给大家分享3款.NET开源.功能强大的通讯调试工具,帮助大家提高通讯调试的效率和准确性. LLCOM LLCOM是一个.NET开源的.功能强大的串口调试工具.支持Lua自动化处理.串口调 ...
- 一句话,我让 AI 帮我做了个 P 图网站!
每到过节,不少小伙伴都会给自己的头像 P 个图,加点儿装饰. 比如圣诞节给自己头上 P 个圣诞帽,国庆节 P 个小红旗等等.这是一类比较简单.需求量却很大的 P 图场景,也有很多现成的网站和小程序,能 ...
- 推荐 5 个 火火火火 的CMS开源.Net项目
下面推荐5个基于.NetCore开发的CMS开源项目. 一.OrchardCore 基于ASP.NET Core 构建的.模块化和多租户应用程序框架,采用文档数据库,非常高性能,跨平台的系统. 1.跨 ...
- 【Java 温故而知新系列】基础知识-02 数据基本类型
1.Java基本数据类型 Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间. 基本数据类型 数值型:整数类型(byte,short,int,lon ...
- Jetbrain Fleet体验版linxu环境开发Python初体验
Jetbrain Fleet体验版linxu环境开发Python初体验 (base) linxu@linxu-PC:~/Projects/FleetProjects$ conda activate d ...
- 优化博客Ⅱ-CDN加速
CDN加速 自从有了第一次博客优化经验,我就越发对优化感兴趣了嘿嘿(✧∇✧). 看着博客首页打开时长为1200ms左右,我又开始琢磨有什么办法能再给网站提提速,让访问时间降低到1000ms以下,这时候 ...