Cod sursa(job #1792003)

Utilizator awdawdagfAndrei Palinteanu awdawdagf Data 29 octombrie 2016 22:13:31
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>
#include <cmath>

using namespace std;

const int valoareMaxima=1000000;
int numerePrime[valoareMaxima+1], k, n;
bool esteVizitat[valoareMaxima+1];

int putere(int x, int y)
{
    int p=0;
    while(x%y==0)
    {
        x/=y;
        p++;
    }
    return p;
}

int indicatorulLuiEuler(int x)
{
    int p=1;
    if(!esteVizitat[x])
        return x-1;
    else
    {
        for(int i=1; i<=k; i++)
        {
            if(numerePrime[i]>x)
                break;
            else
            {
                int pr=putere(x, numerePrime[i]);
                if(pr!=0)
                    p*=(numerePrime[i]-1)*pow(numerePrime[i], pr-1);
            }
        }
    }
    return p;
}

int main()
{
    esteVizitat[1]=1;
    ifstream fin("fractii.in");
    fin>>n;
    for(int i=2; i<=n; i++)
    {
        if(!esteVizitat[i])
        {
            numerePrime[++k]=i;
            for(int j=i+i; j<=n; j+=i)
                esteVizitat[j]=true;
        }
    }
    int solutie=0;
    for(int i=1; i<=n; i++)
        solutie+=indicatorulLuiEuler(i);
    ofstream fout("fractii.out");
    fout<<solutie*2-1;
    return 0;
}