Cod sursa(job #850037)

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

    }
     for(q=i;q<=n;q++)
        if(ciur[q])
            primes.push_back(q);
}
long totient(long x)
{
    if(x <= 1)  return 1;
    if(ciur[x]) return x-1;

    long cx = x ,phi = x,d,ind;

    ind = 0;

    while (cx!=1)
    {
        d = primes[ind];
        if(cx%d == 0)
        {
            phi -= phi/d;
            while(cx%d == 0)
                {cx /=d;}
        }
        ind++;

    }
    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;
}