Cod sursa(job #213841)

Utilizator philandrewChindea Filip philandrew Data 11 octombrie 2008 20:27:39
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <fstream>

int prime[100000];
int np;
  
using namespace std;

int eulerphi (int nr) {
  int prod = 1;
  int c = 1;
  bool flg;
  while ((nr > 1) && (c <= np)) {
    flg = false;
    while (nr%prime[c] == 0){
      flg = true;
      prod *= prime[c];
      nr /= prime[c];
    }
    if (flg) { prod /= prime[c]; prod *= prime[c] - 1; }
    c++;
  }
  return prod;
}

bool eprim(int i){
  for (int j = 2; j*j<=i; j++){
    if (i%j == 0){
      return false;
    }
  }
  return true;
}

void genprimes(){
  int i;
  np = 5;
  prime[1] = 2; prime[2] = 3; prime[3] = 5;
  prime[4] = 7; prime[5] = 11;
  for (i = 12; i <= 1000000; i++) {
    if (!((i%2 == 0) || (i%3 == 0))) {
      if (!((i%5 == 0) || (i%7 == 0))) {
        if (!(i%11 == 0)){
          if (eprim(i)){
            np++;
            prime[np] = i;
          }
        }
      }
    }
  }
}

int main(){
  int n, nr;
  ifstream fin("fractii.in");
  ofstream fout("fractii.out");
  fin >> n;
  genprimes();
  
  nr = -1;
  for (int i = 1; i <= n; i++) nr += 2*eulerphi(i);
  
  fout << nr;
  fin.close();
  fout.close();
  return 0x0;
}