Cod sursa(job #1066762)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 25 decembrie 2013 16:37:32
Problema Oz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

const int Nmax =  10001;
const int Mmax = 100001;

struct nod
{
    int i, j;
    long long d;

} v[Mmax];

int N, M;
long long sol[Nmax];

long long gcd( long long a, long long b )
{
    if ( a == b )
            return a;

    if ( a == 0 )
            return b;

    if ( b == 0 )
            return a;

    if ( ~a & 1 )
    {
        if ( b & 1 )
                return gcd( a >> 1, b );
        else
                return gcd( a >> 1, b >> 1 ) << 1;
    }

    if ( ~b & 1 )
            return gcd( a, b >> 1 );

    if ( a > b )
            return gcd( ( a - b ) >> 1, b );
    else
            return gcd( ( b - a ) >> 1, a );
}

long long lcm( long long a, long long b )
{
    return a * b / gcd( a, b );
}

int valid()
{
    for ( int i = 1; i <= M; ++i )
    {
        if ( gcd( sol[ v[i].i ], sol[ v[i].j ] ) != v[i].d )
                return 0;
    }

    return 1;
}

int main()
{
    ifstream f("oz.in");
    ofstream g("oz.out");

    f >> N >> M;

    fill( sol + 1, sol + N + 1, 1 );

    for ( int i = 1; i <= M; ++i )
    {
        f >> v[i].i >> v[i].j >> v[i].d;

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

    if ( valid() == 0 )
            g << "-1\n";
    else
    {
        for ( int i = 1; i <= N; ++i )
                g << sol[i] << " ";

        g << "\n";
    }
    return 0;
}