Cod sursa(job #595829)

Utilizator t2010tZaharia Teofil t2010t Data 14 iunie 2011 15:17:37
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>
#include <math.h>
using namespace std;

struct s_factor
{
int d; //baza
int p; //puterea
};

int n,total;
bool ciur[1000001];

int nfact;
s_factor fact[20];


void create_ciur();
int euler(int k);

int main()
{
ifstream in("fractii.in");
ofstream out("fractii.out");

int i1;

in>>n;

create_ciur();

//luam fiecare numar 2<=x<=n si calculam func. euler pt acesta, adunand la total
for(i1=2;i1<=n;i1++)
  total += euler(i1);

total = total*2 + 1;

out<<total;

in.close();
out.close();
return 0;
}

void create_ciur()
{
int i1,i2;
for(i1=2;i1<=n;i1++)
  for(i2=2;i1*i2<=n;i2++)
    ciur[i1*i2] = true;
}

int euler(int k)
{
int i1,div,p=1;

//daca k numar prim
if(!ciur[k])
  p = k-1;
else
  {
  //descompunere in factori
  nfact = 0;
  div = 2;

  while(k>1)
    {
    while(ciur[div]) //gasire div prim
      div++;
    if(!(k%div)) //daca se divide
      {
      fact[nfact].d = div;
			fact[nfact].p = 0;
      while(!(k%div)) //cat timp se divide
        {
        fact[nfact].p++;
        k = k/div;
				}
      nfact++;
      }
    div++; //trecerea la un div superior
    }

  //functia euler
  for(i1=0;i1<nfact;i1++)
		p *= (fact[i1].d-1) * (int)pow(fact[i1].d, fact[i1].p-1);
  }
return p;
}