Cod sursa(job #1553344)

Utilizator antanaAntonia Boca antana Data 19 decembrie 2015 16:48:40
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>
#define MAX 1000000
using namespace std;
long long ciur[MAX+1], eu[MAX+1], put[MAX+1];
void ciuruire(int n)
{
    int prim=2, i;
    while(prim*prim<=n)
    {
        for(i=prim;i*prim<=n;i++)
        {
            ciur[i*prim]=1;
            put[i*prim]=prim;
        }
        prim++;
        while(ciur[prim]==1)
            prim++;
    }
}
int main()
{
    freopen("fractii.in", "r", stdin);
    freopen("fractii.out", "w", stdout);
    long long n, i, j, pp, suma, ci;
    scanf("%lld", &n);
    ciuruire(n);
    suma=0;
    for(i=2;i<=n;i++)
    {
        if(ciur[i]==0){
            suma+=i-1;
            eu[i]=i-1;
        }
        else{
            ci=i;
            pp=1;
            while(ci%put[i]==0)
            {
                ci/=put[i];
                pp*=put[i];
            }
            if(ci==1)
            {
                eu[i]=(put[i]-1)*(pp/put[i]);
                suma+=eu[i];
            }
            else{
                eu[i]=eu[pp]*eu[ci];
                suma+=eu[i];
            }
        }
    }
    printf("%lld", suma*2+1);
    return 0;
}