[ARC122E] Increasing LCMs
Problem Statement
We have a sequence of $N$ positive integers: $A_1,A_2,\cdots,A_N$.
You are to rearrange these integers into another sequence $x_1,x_2,\cdots,x_N$, where $x$ must satisfy the following condition:
- Let us define $y_i=\operatorname{LCM}(x_1,x_2,\cdots,x_i)$, where the function $\operatorname{LCM}$ returns the least common multiple of the given integers. Then, $y$ is strictly increasing. In other words, $y_1<y_2<\cdots<y_N$ holds.
Determine whether it is possible to form a sequence $x$ satisfying the condition, and show one such sequence if it is possible.
Constraints
- $1 \leq N \leq 100$
- $2 \leq A_1 < A_2 \cdots < A_N \leq 10^{18}$
- All values in input are integers.
Input
Input is given from Standard Input in the following format:
$N$
$A_1$ $A_2$ $\cdots$ $A_N$
Output
If it is possible to form a sequence $x$ satisfying the condition, print your answer in the following format:
Yes
$x_1$ $x_2$ $\cdots$ $x_N$
If it is impossible, print No.
Sample Input 1
3
3 4 6
Sample Output 1
Yes
3 6 4
For $x=(3,6,4)$, we have:
- $y_1=\operatorname{LCM}(3)=3$
- $y_2=\operatorname{LCM}(3,6)=6$
- $y_3=\operatorname{LCM}(3,6,4)=12$
Here, $y_1<y_2<y_3$ holds.
Sample Input 2
3
2 3 6
Sample Output 2
No
No permutation of $A$ would satisfy the condition.
Sample Input 3
10
922513 346046618969 3247317977078471 4638516664311857 18332844097865861 81706734998806133 116282391418772039 134115264093375553 156087536381939527 255595307440611247
Sample Output 3
Yes
922513 346046618969 116282391418772039 81706734998806133 255595307440611247 156087536381939527 134115264093375553 18332844097865861 3247317977078471 4638516664311857
巧妙地,考虑倒着构造整个序列。
想一下如何选出一个可以排在最后的数,当且仅当他存在某一个质因子的次数是严格最大的。
可以先用 Pollard-Pho 分解出来判断。
每次选一个可以放在最后的元素,不会使本来可以放的数变成不能放。
但是真的要 Pollard-Pho 吗?
枚举 \(10^6\) 以内的数进行分解,那么还没分解出来的要不是两个大质数相乘,要不是一个质数。
对于两个大质数的情况,枚举其他的数,取gcd,如果取出来不是 1 我们就分解出来了,否则可以把这个数当成一个数,不影响性质。
#include<bits/stdc++.h>
using namespace std;
const int N=105,M=N*30;
typedef long long LL;
int p[N][M],c,n,vs[N],st[N];
LL a[N],to[M],b[N];
map<LL,LL>v;
multiset<int>s[M];
LL gcd(LL x,LL y)
{
if(!y)
return x;
return gcd(y,x%y);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",a+i),b[i]=a[i];
for(int j=2;j<=1000000;j++)
{
if(a[i]%j==0)
{
if(!v[j])
to[++c]=j,v[j]=c;
while(a[i]%j==0)
a[i]/=j,p[i][v[j]]++;
}
}
}
for(int i=1;i<=n;i++)
{
if(a[i]==1)
continue;
int fl=0;
for(int j=1;j<=n;j++)
{
LL d=gcd(a[i],a[j]);
if(d^a[i]&&d^1)
{
if(!v[d])
v[d]=++c;
if(!v[a[i]/d])
to[++c]=a[i]/d,v[a[i]/d]=c;
++p[i][v[d]],++p[i][v[a[i]/d]];
fl=1,j=n;
}
}
if(!fl)
{
if(!v[a[i]])
to[++c]=a[i],v[a[i]]=c;
p[i][v[a[i]]]++;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=c;j++)
s[j].insert(p[i][j]);
// for(int i=1;i<=n;i++)
// {
// printf("%lld ",b[i]);
// for(int j=1;j<=c;j++)
// printf("%lld %d\n",to[j],p[i][j]);
// puts("");
//
// }
for(int i=1;i<=n;i++)
{
int pf=0;
for(int j=1;j<=n;j++)
{
if(vs[j])
continue;
int fl=0;
for(int k=1;k<=c;k++)
if(s[k].size()==1||(*(--s[k].end())==p[j][k]&&(*--s[k].end())^(*(--(--s[k].end())))))
fl=1,vs[j]=1,st[i]=j,k=c,pf=1;
if(fl)
{
for(int k=1;k<=c;k++)
s[k].erase(s[k].lower_bound(p[j][k]));
j=n;
}
}
if(!pf)
return puts("No"),0;
}
puts("Yes");
for(int i=n;i>=1;i--)
printf("%lld ",b[st[i]]);
}
[ARC122E] Increasing LCMs的更多相关文章
- ARC 122 简要题解
ARC 122 简要题解 传送门 A - Many Formulae 考虑对于每个数分别算其贡献. 通过枚举该数前面的符号,借助一个非常简单的 \(\mathrm{DP}\)(\(f_{i,0/1}\ ...
- [LeetCode] Increasing Triplet Subsequence 递增的三元子序列
Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the ar ...
- [LeetCode] Longest Increasing Path in a Matrix 矩阵中的最长递增路径
Given an integer matrix, find the length of the longest increasing path. From each cell, you can eit ...
- [LeetCode] Longest Increasing Subsequence 最长递增子序列
Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...
- git error: unable to rewind rpc post data - try increasing http.postBuffer
error: unable to rewind rpc post data - try increasing http.postBuffererror: RPC failed; curl 56 Rec ...
- 【LeetCode】Increasing Triplet Subsequence(334)
1. Description Given an unsorted array return whether an increasing subsequence of length 3 exists o ...
- [tem]Longest Increasing Subsequence(LIS)
Longest Increasing Subsequence(LIS) 一个美丽的名字 非常经典的线性结构dp [朴素]:O(n^2) d(i)=max{0,d(j) :j<i&& ...
- [LintCode] Longest Increasing Subsequence 最长递增子序列
Given a sequence of integers, find the longest increasing subsequence (LIS). You code should return ...
- LintCode-Longest Increasing Subsequence
Given a sequence of integers, find the longest increasing subsequence (LIS). You code should return ...
- Longest Increasing Path in a Matrix -- LeetCode 329
Given an integer matrix, find the length of the longest increasing path. From each cell, you can eit ...
随机推荐
- 线程方法接收参数和返回参数,Java的两种线程实现方式对比
The difference beteen two way 总所周知,Java实现多线程有两种方式,分别是继承Thread类和实现Runable接口,那么它们的区别是什么? 继承 Thread 类: ...
- 如何分析 JVM 内存瓶颈浅谈
背景: 当操作系统内存出现瓶颈时,我们便会重点排查那个应用占用内存过大.对于更深一步分析内存的使用,就进一步去了解内存结构,应用程序使用情况,以及内存如何分配.如何回收,这样你才能更好地确定内存的问题 ...
- C#结合OpenCVSharp4图片相似度识别
OpenCVSharp4图片相似度识别 需求背景:需要计算两个图片的相似度,然后将相似的图片进行归纳 1. 图片相似度算法 由于我是CRUD后端仔,对图像处理没什么概念.因此网上调研了几种相似度算法分 ...
- BZ全景编辑器(KRPano全景可视化编辑器, 无需编写代码, 图形化制作全景漫游)
软件简介 BZ全景编辑器是一款KRPano全景可视化编辑工具,下载安装即可使用,无需拥有任何KRPano代码基础,便可以制作生成精美的全景漫游作品. BZ全景编辑器群:882083973 最新版软件下 ...
- 如何在kubernetes中实现分布式可扩展的WebSocket服务架构
如何在kubernetes中实现分布式可扩展的WebSocket服务架构 How to implement a distributed and auto-scalable WebSocket serv ...
- 位图(bitmap)原理以及实现
大家好,我是蓝胖子,我一直相信编程是一门实践性的技术,其中算法也不例外,初学者可能往往对它可望而不可及,觉得很难,学了又忘,忘其实是由于没有真正搞懂算法的应用场景,所以我准备出一个系列,囊括我们在日常 ...
- nginx URLRewrite基础配置
环境准备: 主机 ip control01 192.168.29.128 nginx01 192.168.29.101 在两台机器上分别部署nginx control01主机nginx配置的内容如下: ...
- 5分钟入门 next13
上半年vercel 推出了nextjs13 这个大版本,刚好最近有个c端的项目,所以就用了这个框架来写,技术体系基本也是文档提到的 tailwindcss + ts + swr + ssr ,总的来开 ...
- MySQL系列之——MySQL介绍和安装、MySQL简介及产品线、安装方式(源码安装 rpm方式 yum方式 通用二进制安装)
文章目录 一 MySQL介绍和安装 1.1 什么是数据? 1.2 什么是数据库管理系统(DBMS)? 1.3 数据库管理系统种类 二 MySQL简介及产品线 2.1 MySQL行业主流版本 2.2 企 ...
- 2023-10-14:用go语言,给定 pushed 和 popped 两个序列,每个序列中的 值都不重复, 只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时, 返回
2023-10-14:用go语言,给定 pushed 和 popped 两个序列,每个序列中的 值都不重复, 只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时, 返回 ...