Cod sursa(job #1693400)

Utilizator llalexandruLungu Alexandru Ioan llalexandru Data 22 aprilie 2016 23:46:42
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 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];
int 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;
    long long cx=x;
    for (i=0; i<P.size() && P[i]<=x; i++)
    {
        if (x%P[i]==0)
        {
            while (x%P[i]==0)
            {
                x /= P[i];
                a *= P[i];
            }
            return S[a]*S[cx/a];
        }
    }
    return x-1;
}

int main()
{
    long long i, sol=0, 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<<'\n';
    return 0;
}