Cod sursa(job #164039)

Utilizator alecmanAchim Ioan Alexandru alecman Data 23 martie 2008 14:23:46
Problema Oz Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include<stdio.h>
#include<string.h>

#define INPUT "oz.in"
#define OUTPUT "oz.out"
#define NMAX 10001
#define VMAX 2000000000
#define CL(x) memset(x,0,sizeof(x));

FILE *fin = fopen(INPUT, "r"),*fout = fopen(OUTPUT, "w");

long N, M;
long long minDiv[ NMAX ];

void readValues();

void solveFunction();

inline long euclid(long, long);

void printSolution();

int main()
{
  readValues();

  solveFunction();

  fclose(fin);
  fclose(fout);

  return 0;
}

void readValues()
{
  fscanf(fin, "%ld %ld", &N, &M);
}

void solveFunction()
{
  long long temp;

  int Valid = 1;

  long nod1, nod2, diviz;

  for(long i = 0; i < M; ++i)
  {
    fscanf(fin, "%ld %ld %ld", &nod1, &nod2, &diviz);

    if(minDiv[ nod1 - 1 ])
    {
      temp = (long long)minDiv[ nod1 - 1 ] * (long long)diviz;

      minDiv[ nod1 - 1 ] = temp / euclid(minDiv[ nod1 - 1 ], diviz);
    }
    else
      minDiv[ nod1 - 1 ] = diviz;

    if(minDiv[ nod2 - 1 ])
    {
      temp = (long long)minDiv[ nod2 - 1 ] * (long long)diviz;

      minDiv[ nod2 - 1 ] = temp / euclid(minDiv[ nod2 - 1 ], diviz);
    }
    else
      minDiv[ nod2 - 1 ] = diviz;

    if(minDiv[ nod1 - 1 ] > VMAX)
    {
      fprintf(fout, "-1\n");

      Valid = 0;
    }
    else
    if(minDiv[ nod2 - 1 ] > VMAX)
    {
      fprintf(fout, "-1\n");

      Valid = 0;
    }

  }

  if(Valid) printSolution();
}

inline long euclid(long A, long B)
{
  if(!B) return A;
  else return euclid(B, A%B);
}

void printSolution()
{
  int Valid = 1;

  for(long i = 0; i < N; ++i)
    if(!minDiv[ i ])
    {
      fprintf(fout, "-1");

      Valid = 0;

      break;
    }

  if(Valid)
  for(long i = 0; i < N; ++i)
    fprintf(fout, "%lld ", minDiv[ i ]);

  fprintf(fout, "\n");
}