Cod sursa(job #3032816)

Utilizator daristyleBejan Darius-Ramon daristyle Data 22 martie 2023 20:13:37
Problema Oz Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>

using namespace std;

ifstream fin("oz.in");
ofstream fout("oz.out");

/*
 * Vom parcurge tripletele si vom lua v[k]=lcm(v[k],d), la final parcurgem tripletele si verificam daca relatia e adevarata
 * si verificam daca elementele din vector sunt mai mici de 2e9
 * Complexitate timp: O(MlogXMAX+N)
 * Complexitate spatiu: O(N+M)
 */

struct mytuple {
		int i;
		int j;
		int d;
};
const int N_MAX = 1e4;
const int M_MAX = 1e5;
const int LIMIT = 2e9;
int v[N_MAX];
mytuple querry[M_MAX];

int gcd(int a, int b) {
	if(!b)
		return a;
	return gcd(b, a % b);
}

int lcm(int a, int b) {
	long long aux = a / gcd(a, b) * (long long) b;
	return (aux > LIMIT) ? -1 : aux;
}

int main() {
	int n, m;
	fin >> n >> m;
	for(int i = 0; i < n; ++i)
		v[i] = 1;
	for(int i = 0; i < m; ++i){
		fin >> querry[i].i >> querry[i].j >> querry[i].d;
		--querry[i].i;
		--querry[i].j;

		v[querry[i].i] = lcm(v[querry[i].i], querry[i].d);
		v[querry[i].j] = lcm(v[querry[i].j], querry[i].d);
	}

	int i = 0;
	while(i < m && gcd(v[querry[i].i], v[querry[i].j]) == querry[i].d)
		++i;
	int j = 0;
	while(j < n && v[j] >= 0)
		++j;

	if(i >= m && j >= n)
		for(int k = 0; k < n; ++k)
			fout << v[k] << ' ';
	else
		fout << -1;
	fout.put('\n');

	fin.close();
	fout.close();
	return 0;
}