Cod sursa(job #1533215)

Utilizator Julian.FMI Caluian Iulian Julian. Data 22 noiembrie 2015 11:53:54
Problema Fractii Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <iostream>
#include <fstream>
#define nmax 1000000
using namespace std;
ifstream fin("fractii.in");
ofstream fout("fractii.out");
int viz[nmax];
long divi[nmax],nr;

long ridic(long x,long p)
{
    long rez=1;
    int i=0;
    while((1<<i)<=p)
    {
        if((1<<i)& p)
            rez*=x;
        x=x*x;
        i++;
    }


    return rez;
}

int main()
{long p,d,r,n,i,aux;
unsigned long long rez=0;
fin>>n;

for(d=2;d*d<=n;d++)
    if(!viz[d])
        for(i=2;i*d<=n;i++)
            viz[i*d]=1;
    for(i=2;i<=n;i++)
        if(!viz[i])
            divi[++nr]=i;

    for(i=2;i<=n;i++)
    {
        p=1;aux=i;d=1;

        while(aux!=1 && viz[aux])
        {r=0;
            while(aux%divi[d]==0)
            {
                r++;aux/=divi[d];
            }
        if(r)p*=(divi[d]-1)*ridic(divi[d],r-1);
        d++;

        }
        if(aux>1)p*=(aux-1);
        rez+=2*p;
    }
fout<<rez+1;
}