Cod sursa(job #13335)

Utilizator alinaddoca alina alinad Data 6 februarie 2007 11:58:54
Problema Fractii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<stdio.h>


FILE *f=fopen("fractii.in", "r"), *g=fopen("fractii.out", "w");


long n;

int prim(long i)
{
 long d=2;
 while(d*d<=i)
  {
   if(i%d==0)
     return 0;
   d++;
  }
 return 1;
}


long cmmmc(long a, long b)
{
 long div[10000];
 long d=2, t, aux, k=1, max, i;
 aux=a;
 if(a>b)
  max=a;
 else
  max=b;
 for(i=1; i<=max; i++)
  div[i]=1;
 while(aux!=1)
  {
   t=1;
   while(aux%d==0)
    {
     t=t*d;
     aux=aux/d;
    }
   if(t/div[d]!=0 && t/div[d]!=1)
     {
      k=k*(t/div[d]);
      div[d]=t;
     }
   d++;
  }
 aux=b;
 d=2;
 while(aux!=1)
  {
   t=1;
   while(aux%d==0)
    {
     t=t*d;
     aux=aux/d;
    }
   if(t/div[d]!=0 && t/div[d]!=1)
     {
      k=k*(t/div[d]);
      div[d]=t;
     }
   d++;
  }

 return k;
}


void generare()
{
 long i, d, aux, q=1, t, j;
 long s, c[10000];
 s=n*n-n+1;
 for(i=2; i<=n; i++)
  if(prim(i)==1)
    {
     c[q++]=i;
     d=1;
     aux=i;
     while(aux<=n)
      {
       d++;
       aux=i*d;
      }
     s=s-(d-1)*(d-2);
    }

 for(i=1; i<q; i++)
   for(j=i+1; j<q; j++)
     {
      t=cmmmc(c[i], c[j]);
      d=1;
      aux=t;
      while(aux<=n)
       {
	d++;
	aux=t*d;
       }
      s=s+(d-1)*(d-2);
     }

 fprintf(g, "%ld", s);
}


int main()
{
 fscanf(f, "%ld", &n);
 generare();

 fclose(f);
 fclose(g);

 return 0;

}