Untitled

 avatar
unknown
plain_text
21 days ago
1.5 kB
2
Indexable
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
//#pragma GCC optimize ("O3")
//#pragma GCC optimize ("Ofast")

using namespace std;
const int M = 1e5 + 10;
int n, ind;
int a[M];
bool mark[M * 2 + 5000];
vector <int> adj[M * 2 + 5000];
map <int, int> mapp;
vector <int> prime;
vector <int> vecind;
vector <int> vec;
int ans[M];

void fp(){
	int z = 32000;
	bool vis[z] = {};
	for(int i = 2; i < z; i++){
		if(!vis[i]){
			prime.pb(i);
			for(int j = i; j < z; j += i)
				vis[j] = 1;
		}
	}
}

inline void add_edge(int i, int j){
	int r, x;
	x = mapp[j];
	if(x == 0){
		mapp[j] = ind;
		x = ind;
		ind++;
	}
	adj[i].pb(x);
	adj[x].pb(i);
}
void analize(int i){
	int b = a[i];
	for(ll j : prime){
		if(j * j > b)
			break;
		if(!(b % j))
			add_edge(i, j);
		while(!(b % j))
			b /= j;
		if(b == 1)
			break;
	}
	if(b != 1)
		add_edge(i, b);
}

void dfs(int v){
	if(v < n){
		vecind.pb(v);
		vec.pb(a[v]);
	}
	mark[v] = 1;
	for(int u : adj[v]){
		if(!mark[u])
			dfs(u);
	}
}
void prs(){
	sort(vec.begin(), vec.end());
	sort(vecind.begin(), vecind.end());
	for(int i = 0; i < vec.size(); i++)
		ans[vecind[i]] = vec[i];
	vecind.clear();
	vec.clear();
}
int main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	fp();
	cin >> n;
	ind = n;
	for(int i = 0; i < n; i++){
		cin >> a[i];
		analize(i);
	}


	for(int i = 0; i < n; i++){
		if(mark[i] == 0){
			dfs(i);
			prs();
		}
	}
	for(int i = 0; i < n; i++)
		cout << ans[i] << ' ';
	return 0;
}
Leave a Comment