Cod sursa(job #213847)

Utilizator philandrewChindea Filip philandrew Data 11 octombrie 2008 20:37:14
Problema Fractii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 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 = 12;
  prime[1] = 2; prime[2] = 3; prime[3] = 5;
  prime[4] = 7; prime[5] = 11; prime[6] = 13;
  prime[7] = 17; prime[8] = 19; prime[9] = 23;
  prime[10] = 29; prime[11] = 31; prime[12] = 33;
  for (i = 34; i <= 1000000; i++){
    for (int j = 1; j <= 12; j++) if (i%prime[j] == 0) break;
    if (eprim(i)){
      np++;
      prime[np] = i;
    }
  }
}

int main(){
  int n;
  long long 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;
}