Cod sursa(job #1693335)

Utilizator llalexandruLungu Alexandru Ioan llalexandru Data 22 aprilie 2016 21:34:41
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <vector>
#include <cmath>
#define NM 1000005

using namespace std;

ifstream fin("fractii.in");
ofstream fout("fractii.out");

int n;
bool Prim[NM];
long long S[NM];
vector <int> P;

void GenCiur()
{
    int i, j, lim;
    P.push_back(2);
    lim=sqrt(n);
    for (i=3; i<=n; i+=2)
    {
        if (Prim[i]==0)
        {
            P.push_back(i);
            for (j=i; j<=n; j+=2*i)
                Prim[j]=1;
        }
    }
}

long long Euler(int x)
{
    long long a=1, i, c;
    int sz=P.size();
    for (i=0; i<sz; i++)
    {
        if (x%P[i]==0)
        {
            c=1;
            while (x%P[i]==0)
            {
                x /= P[i];
                c *= P[i];
            }
            a*=S[c];
        }
        if (x==1)
            break;
    }
    if (x!=1)
    {
        a/=x;
        a*=x-1;
    }
    return a;
}

int sol;

int main()
{
    long long i, j;
    fin>>n;
    GenCiur();
    int sz=P.size();
    for (i=0; i<sz; i++)
    {
        for (j=P[i]; j<=n; j*=P[i])
        {
            S[j]=(j/P[i])*(P[i]-1);
        }
    }
    for (i=2; i<=n; i++)
    {
        if(S[i]==0)
        {
            S[i]=Euler(i);
            sol+=S[i];
        }
        else
            sol+=S[i];
    }
    fout<<2*sol+1;
    return 0;
}