Cod sursa(job #191525)

Utilizator cata00Catalin Francu cata00 Data 27 mai 2008 04:38:30
Problema Fractii Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <stdio.h>

int n;
int primes[1000000];
int numPrimes;

int relativelyPrime(int n) {
  int origN = n;
  numPrimes = 0;
  int i = 2;
  while (n > 1 && i*i <= n) {
    if (n % i == 0) {
      primes[numPrimes++] = i;
      do {
	n /= i;
      } while (n % i == 0);
    }
    i++;
  }
  if (n > 1) {
    primes[numPrimes++] = n;
  }
  //printf("%d: ", origN);
//   for (int k = 0; k < numPrimes; k++) {
//     printf("%d ", primes[k]);
//   }

  int multiplier = origN;
  int result = 1;
  for (int k = 0; k < numPrimes; k++) {
    multiplier /= primes[k];
    result *= primes[k] - 1;
  }
  //  printf("| multiplier: %d result: %d", multiplier, result * multiplier);

  //printf("\n");
  return result * multiplier;
}

int main(void) {
  FILE* f = fopen("fractii.in", "rt");
  fscanf(f, "%d", &n);
  fclose(f);

  long long result = 1;
  for (int i = 2; i <= n; i++) {
    result += 2 * (long long) relativelyPrime(i);
  }

  f = fopen("fractii.out", "wt");
  fprintf(f, "%lld\n", result);
  fclose(f);
  return 0;
}