Cod sursa(job #850022)

Utilizator unincepatorDigi Cazan unincepator Data 7 ianuarie 2013 22:22:05
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<fstream>
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
vector<bool> ciur;
void make_ciur(long n)
{
    long i,j;
    ciur.resize(n+1,1);
    ciur[0]=ciur[1]=0;
    i=2;
    while (i<=(long)(sqrt((double)n)))
    {if(ciur[i])
       {

       j= i*i;
        while (j<=n)
        {
            ciur[j]=0;
            j+=i;
        }
        }
        ++i;
    }

}
long totient(long x)
{
    if(x <= 1)  return 1;
    if(ciur[x]) return x-1;
    long cx = x ,phi = x,d=3;
    if(cx%2 == 0)
    {
        phi -= phi/2;
        while(cx%2 == 0)
            {cx/=2;}
    }

    while (cx>1)
    {
        if(cx%d == 0)
        {
            phi -= phi/d;
            while(cx%d == 0)
                {cx /=d;}
        }
        d+=2;
        while(!ciur[d])
            d+=2;
    }
    return phi;
}
int main()
{
    long n,nr_fractii = 0;
    ifstream fin("fractii.in");
    fin>>n;
    fin.close();
    make_ciur(n);
    ofstream fout("fractii.out");
    for(long i = 1; i<=n; ++i)
            nr_fractii+=totient(i);

    fout<<nr_fractii*2-1;

    fout.close();
    return 0;
}