题解:AT_arc122_e [ARC122E] Increasing LCMs
由于 \(n\) 只有 \(100\),考虑 \(O(n^3)\) 做法,用 \(O(n^2)\) 时间确定一个位置。
发现当前的 \(lcm\) 已经确定,所以确定最后一个位置的限制显然比确定其他位置更少。于是我们可以通过枚举,用 \(O(n^2\log V)\) 的时间确定这个数 \(x\)。
但是直接算 \(lcm\) 判断会溢出,我们对每个数只保留和 \(x\) 的 \(\gcd\) 即可,接下来就成了一个 \(n-1\) 的子问题。
这样的正确性是可以保证的,假设正确的 \(x\) 不在最后,那么将 \(x\) 换到最后一定不劣。
Code:
#include<iostream>
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define per(i,l,r) for(int i=(l);i>=(r);i--)
using namespace std;
typedef long long ll;
const int maxn=105;
inline ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
ll a1[maxn];
int main(){
int in;
cin>>in;
rep(v1,1,in)scanf("%lld",a1+v1);
bool flag=true;
per(v1,in,2){
int cp=0;
rep(v2,1,v1){
ll lcm=1;
rep(v3,1,v1)if(v3!=v2){
ll t=gcd(a1[v3],a1[v2]);
lcm=lcm/gcd(lcm,t)*t;
}
if(lcm!=a1[v2]){
cp=v2;
break;
}
}
if(cp)swap(a1[cp],a1[v1]);
else{
flag=false;
break;
}
}
if(flag){
printf("Yes\n");
rep(v1,1,in)printf("%lld%c",a1[v1],v1!=in?' ':'\n');
}
else printf("No\n");
return 0;
}

浙公网安备 33010602011771号