Cod sursa(job #1412993)

Utilizator danstefanDamian Dan Stefan danstefan Data 1 aprilie 2015 18:00:22
Problema Oz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <fstream>
#include <cstdio>
using namespace std;
int i,m,n,fa,e,ap[977990],ma,j,rc,v[10010];
long long a,b,c,cb,ca,cc,cca,ccb;
bool ok=true;
int main(){
    freopen("oz.in","r",stdin);
    ofstream g ("oz.out");
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;++i){
    scanf("%d%d%d",&a,&b,&c);
    if(v[a]==0&&v[b]==0)v[a]=c,v[b]=c;
    else
    if(v[a]%c==0&&v[b]==0)continue;
    else {
        fa=2;
        ca=a;
        cc=c;
        cb=b;
        a=v[a];
        b=v[b];
        cca=a;
        ccb=b;
        while(c!=1&&fa*fa<=cc){
            e=0;
            while(c%fa==0)c/=fa,e++;
            if(e!=0){ap[fa]+=e;
            if(fa>ma)ma=fa;}
            fa++;}
             if(c>1){
                 if(c<=987990){ap[c]++;
            if(c>ma)ma=c;}
            rc=c;}
                if(cca==1)cca*=cc;
            else{
            fa=2;
            while(fa<=ma){
                if(ap[fa]!=0){
                    e=0;
                    if(a!=1)
            while(a%fa==0)a/=fa,e++;
            e=ap[fa]-e;
            for(j=1;j<=e;++j){cca*=fa;
            if(rc*fa>2000000000){ok=false;i=m+2;}
            else  rc*=fa;}
               if(cca>2000000000){ok=false;i=m+2;}}
            fa++;}}
            if(ccb==1)ccb*=cc;
            else{
            fa=2;
            while(fa<=ma){
                if(ap[fa]!=0){
            e=0;
            if(b!=1)
            while(b%fa==0)b/=fa,e++;
            e=ap[fa]-e;
            for(j=1;j<=e;++j){ccb*=fa;
            if(rc*fa>2000000000){ok=false;i=m+2;}
            else  rc*=fa;}
            if(ccb>2000000000){ok=false;i=m+2;}
            ap[fa]=0;}
            fa++;}}
            v[ca]=cca;v[cb]=ccb;}}
            if(ok)
            for(i=1;i<=n;++i)g<<v[i]<<" ";
            else g<<-1;
            return 0;}