Cod sursa(job #67041)

Utilizator scvalexAlexandru Scvortov scvalex Data 22 iunie 2007 12:56:07
Problema Fractii Scor 30
Compilator c Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>
#include <string.h>

int prime[78498];

int nrPrime = 0;

int citeste() {
  FILE *fin = fopen("fractii.in", "r");

  int n; 
  fscanf(fin, "%d", &n);

  fclose(fin);

  return n;
}

void genPrime(int n) {
  char p[1000001];

  memset(p, 1, sizeof(char) * 1000001);

  p[1] = 0;
//   printf("{2");

  int i = 2;
  for (; i <= n; ++i)
    if (p[i]) {
//       printf(", %d", i);
      prime[nrPrime] = i;
      ++nrPrime;
      int j = i * 2;
      while (j <= n) {
        p[j] = 0;
        j += i;
      }
    }
//   printf("}\n");
//   printf("Total: %d numere prime\n", nrPrime);
}

int phi(int n) {
  double rez = n;

//   printf("Calculeaz phi(%d)...\n", n);

  int i = 0;
  while ((i < nrPrime) && (prime[i] <= n)) {
//     printf("Verific daca este divizibil cu %d\n", prime[i]);
    if (n % prime[i] == 0) {
      rez *= (double)(prime[i] - 1) / (double)prime[i];
//       printf("%g\n", (double)(prime[i] - 1) / (double)prime[i]);
    }
    ++i;
  }

  return rez;
}

void scrie(int rez) {
  FILE *fout = fopen("fractii.out", "w");

  fprintf(fout, "%d\n", rez);

  fclose(fout);
}

int main(int argc, char *argv[]) {
  int n = citeste();

  genPrime(n);

  int i = 2;
  int rez = 1;
  for (; i <= n; ++i) {
    rez += phi(i) * 2;
//     printf("Phi(%d) = %d\n", i, phi(i));
  }

  scrie(rez);

  return 0;
}