Cod sursa(job #973951)

Utilizator gbi250Gabriela Moldovan gbi250 Data 16 iulie 2013 02:53:13
Problema Oz Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <cstdio>
#define SIZE 100002
using namespace std;
int n, m, i, x[SIZE], y[SIZE], d[SIZE];
long long v[10002];

long long gcd(int x, int y)
{
    if(x==y)
        return x;
    else if(x==0)
        return y;
    else if(y==0)
        return x;
    if(~x&1)
        if(~y&1)
            return gcd(x>>1, y>>1)<<1;
        else
            return gcd(x>>1, y);
    if(~y&1)
        return gcd(x, y>>1);
    if(x>y)
        return gcd(y, (x-y)>>1);
    else
        return gcd(x, (y-x)>>1);
}

long long lcm(int x, int y)
{
    return (long long)(x*y/gcd(x, y));
}

bool verif()
{
    for(int i=1;i<=m;++i)
       if(gcd(v[x[i]], v[y[i]])!=d[i])
            return 0;
    return 1;
}

int main()
{
    freopen("oz.in", "r", stdin);
    freopen("oz.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(i=1;i<=n;++i)
        v[i]=1;
    for(i=1;i<=m;++i)
    {
        scanf("%d %d %d", &x[i], &y[i], &d[i]);
        v[x[i]]=lcm(v[x[i]], d[i]);
        v[y[i]]=lcm(v[y[i]], d[i]);
    }
    if(verif())
        for(i=1;i<=n;++i)
            printf("%lld ", v[i]);
    else
        printf("-1\n");
    return 0;
}