Cod sursa(job #213324)

Utilizator IrnukIrina Grosu Irnuk Data 9 octombrie 2008 14:21:28
Problema Oz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
/*Oz  
 
In taramul fermecat din Oz exista un vrajitor care are ca scop salvarea lumii. Fortele malefice incearca insa sa il impiedice si, pentru aceasta, il provoaca pe vrajitor la un joc al carui castigator va decide soarta lumii. Astfel, fortele raului aleg la intamplare un vector de N numere naturale nenule si ii transmit vrajitorului M triplete de forma (i j d), cu semnificatia ca cel mai mare divizor comun dintre al i-lea si al j-lea numar din vector este d. Scopul jocului este ca, pornind de la cele M triplete, sa se gaseasca vectorul initial. In cazul in care fortele raului triseaza si nu exista nicio solutie, sa se precizeze acest lucru.  
 
*/  
  
  
#include<fstream.h>   
  
long n,m,d,v[10005],max=2000000000,ok;   
  
ifstream fin("oz.in");   
ofstream fout("oz.out");   
  
long cmmdc(long x,long y)   
{   
    long r;   
    if(x==1 || y==1)   
        return 1;   
    while(y!=0)   
    {   
        r=x%y;   
        x=y;   
        y=r;   
    }   
    return x;   
  
}   
 
int main()   
{   
    long i,x,y,f;   
    fin>>n>>m;   
  
    for(i=1;i<=n;i++)   
        v[i]=1;   
  
    for(i=0;i<m;i++)   
    {   
        fin>>x>>y>>d;   
           
        if(v[x]==1)   
            v[x]=d;   
        if(v[y]==1)   
            v[y]=d;   
		
		f=d/cmmdc(v[x],d);
		if(v[x]*f>max || v[x]*f<v[x])
			ok=1;
        else
			v[x]=v[x]*(d/f);   
		
		f=d/cmmdc(v[y],d);
		if(v[y]*f>max || v[y]*f<v[y])
			ok=1;
        else
        v[y]=v[y]*(d/f);   
  
    }   
  
	for(i=0;i<=n;i++)
		if(v[i]>max || v[i]<0)
			ok=1;
	if(ok==0)
    for(i=1;i<=n;i++)   
        fout<<v[i]<<" ";   
	else
		fout<<"-1";
    fout<<'\n';   
  

    fout.close();   
    return 0;   
}