Cod sursa(job #2941100)

Utilizator StefanStratonStefan StefanStraton Data 17 noiembrie 2022 09:47:43
Problema Oz Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>
#include <math.h>
using namespace std;
ifstream in ("oz.in"); ofstream out ("oz.out");
int N, M; /// un vector cu N numere; M triplete
int v[10001] = {1};
int cmmmc(int a, int b){
    int rezultat = 1, maxab;
    /// puterile comune si necomune la puterea cea mai mare
    /// a * b = cmmmc (a,b) * cmmdc (a,b)
    a < b ? maxab = b : maxab = a;
    for(int i = 2; i < maxab; i++){
        int cont1 = 0, cont2 = 0;
        while(a % i == 0 && a > 0){cont1++; a = a / i;}
        while(b % i == 0 && b > 0){cont2++; b = b / i;}
        cont1 < cont2 ? rezultat *= pow(i,cont2) : rezultat *= pow(i,cont1);
    }
    return rezultat;
}
int cmmdc(int a, int b){
    int rezultat = a * b / cmmmc(a,b);
    return rezultat;
}
int main(){
    bool solutie = true;
    struct ijd{
        int i, j, d;
    }triplet[M+1];
    for(int x = 0 ; x < M; x++){
        /**< Se memoreaza tripletele pentru a se putea verifica vectorul final */
        in >> triplet[x].i >> triplet[x].j >> triplet[x].d;
        v[triplet[x].i] = cmmmc(v[triplet[x].i],triplet[x].d);
        v[triplet[x].j] = cmmmc(v[triplet[x].j],triplet[x].d);
    }
    /**< Verificare */
    /// se parcurg din nou tripletele
    /// daca un triplet i j d nu se verifica solutie = false
    for(int x = 0 ; x < M; x++){
        if(cmmdc(v[triplet[x].i],(v[triplet[x].i])) != triplet[x].d) solutie = false;
        /// verificare cmmdc de vi si vj = d alfel solutie = false
    }
    if(solutie == true) for(int x = 0 ; x < N; x++) out << v[x];
    else out << "-1";
    in.close(); out.close();
    return 0;
}