Cod sursa(job #1412991)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 1 aprilie 2015 18:00:05
Problema Oz Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int v[10010], prim[200000], k;
bool pm[1000000];
struct triplet
{
    int x, y, d;
} a[100010];

inline int cmmdc (int a, int b)
{
    while (b)
    {
        a %= b;
        swap (a, b);
    }

    return a;
}

inline void ciur (int n)
{
    for (int i = 2; i <= n; ++i)
        if (!pm[i])
        {
            prim[++k] = i;
            for (long long j = 1LL * i * i; j <= n; j += 1LL * i)
                pm[j] = true;
        }
}

int main ()
{
    freopen ("oz.in", "r", stdin);
    freopen ("oz.out", "w", stdout);

    int n, m;
    scanf ("%d %d", &n, &m);

    int ma = 0;
    for (int i = 1; i <= m; ++i)
    {
        scanf ("%d %d %d", &a[i].x, &a[i].y, &a[i].d);
        ma = max (ma, a[i].d);
    }

    bool OK = true;
    ciur (ma);
    for (int i = 1; i <= m; ++i)
    {
        int xx = a[i].x;
        int yy = a[i].y;
        int dd = a[i].d;

        if (!v[xx]) v[xx] = dd;
        if (!v[yy]) v[yy] = dd;

        int cdd = dd;
        for (int j = 1; j <= k && cdd != 1; ++j)
            if (!(cdd % prim[j]))
                if (!(v[xx] % prim[j]))
                {
                    int cv = v[xx];
                    while ((!(cv % prim[j])) && (!(dd % prim[j]))) cdd /= prim[j], cv /= prim[j];
                }

        long long z = 1LL * cdd * v[xx];
        if (z > 2000000000LL)
        {
            OK = false;
            break;
        }

        v[xx] = z;

        for (int j = 1; j <= k && dd != 1; ++j)
            if (!(dd % prim[j]))
                if (!(v[yy] % prim[j]))
                {
                    int cv = v[yy];
                    while ((!(cv % prim[j])) && (!(dd % prim[j]))) dd /= prim[j], cv /= prim[j];
                }

        z = 1LL * dd * v[yy];
        if (z > 2000000000LL)
        {
            OK = false;
            break;
        }

        v[yy] = z;
    }

    if (!OK)
    {
        printf ("-1\n");
        return 0;
    }

    for (int i = 1; i <= n && OK; ++i)
        if (!v[i]) OK = false;

    if (!OK)
    {
        printf ("-1\n");
        return 0;
    }

    for (int i = 1; i <= m && OK; ++i)
    {
        int p = cmmdc (v[a[i].x], v[a[i].y]);
        if (p != a[i].d) OK = false;
    }

    if (!OK)
    {
        printf ("-1\n");
        return 0;
    }

    for (int i = 1; i <= n; ++i)
        printf ("%d ", v[i]);

    printf ("\n");

    return 0;
}