题解: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;
}
posted @ 2025-07-21 13:51  FugiPig  阅读(4)  评论(0)    收藏  举报