Cod sursa(job #953351)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 25 mai 2013 20:02:04
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>
using namespace std;
ifstream fin("fractii.in");
ofstream fout("fractii.out");

bool v[1000001]; // 0 if prime, 1 if composite

//Problema cere in fond toate perechile de numere i,j <= N cu i,j prime intre ele. Folosim deci indicatorul lui Euler
//si, pentru mai multa rapiditate, ciurul lui eratostene pentru a gasi numerele prime (indicatorul lui euler pentru n prim este automat n-1)


void erathostenes (int n)
{
    for (int i=4;i<=n;i=i+2) v[i]=1;
    for (int i=3;i*i<=n;i=i+2)
    {
        if (v[i]) continue;
        for (int j=i; j*i<=n; j++) v[j*i]=1;
    }
}

int euler_totient (int x)
{
    int i,factor[1001],nr=0;
    int temp=x;
    for (i=2; temp>1 ;i++)
    {
        if (temp%i) continue;
        while (temp%i==0)
        {
            temp=temp/i;
        }
        factor[++nr]=i;
    }
    int totient=1;
    for (i=1;i<=nr;i++)            //cale rapida de calculare a indicatorului, nu cred ca e nevoie sa ne complicam cu floaturi
    {
        x=x/factor[i];
        totient=totient*(factor[i]-1);
    }
    return totient*x;
}

int main()
{
    int n; long long f=0;
    fin>>n;
    erathostenes (n);
    for (int i=2; i<=n; i++)
    {
        if (!v[i]) f=f+i-1;
        else f=f+euler_totient (i);
    }
    f=f*2; f++;                   //pentru o fractie x/y ireductibila, exista si fracti y/x ireductibila. De asemenea sa nu uitam de 1/1
    fout<<f;
}