Cod sursa(job #1197776)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 13 iunie 2014 19:06:15
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
using namespace std;
#include <fstream>
ifstream fin("fractii.in");
ofstream fout("fractii.out");

const int Nmax = 1000000;

int nr[Nmax+5], n;
bool isPrime[Nmax+5];
int prim[100000], nrP=1;

void ciur() ;
void calc(int) ;

int main()
{
    int i, j;
    long long s = 1;
    fin>>n;
    //ciur();
    for(i=1; i<=n; ++i) nr[i] = i;
    for(i=2; i<=n; ++i)
    {
        if(nr[i]==i)
            for(j=i; j<=n; j+=i) nr[j] = nr[j] / i * (i-1);
        s += 1LL*nr[i];
    }
    fout<<2*s-1<<'\n';
    return 0;
}


void ciur()
{
    int i, j;
    for(i=2; i<=n; ++i) isPrime[i] = i%2;
    prim[0] = 2;
    for(i=3; i<=n; ++i)
    {
        while(!isPrime[i] && i<=n) ++i;
        if(i<=n) prim[nrP++] = i;
        for(j = i+i+i; j<=n; j += i+i) isPrime[j]=0;
    }
}


void calc(int x)
{
    if(x==1) {nr[1] = 1; return;}
    int rez = x, d, firstD;
    for(d=0; x%prim[d]!=0; ++d) ; firstD = prim[d];
    for(; prim[d]<=x && d<nrP; ++d)
        if(x%prim[d]==0) rez = rez / prim[d] * (prim[d]-1);
    nr[x] = rez;
    for(; x<=n; x *= firstD, rez *= firstD)
        nr[x] = rez;
}