Cod sursa(job #1222840)

Utilizator pentrusandaPentru Sanda pentrusanda Data 24 august 2014 15:35:59
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>
#include <string.h>
#include <iostream>

#define MAX 1000005

using namespace std;

int n,phi[MAX],ciur[MAX],exp[MAX][2],put[25];

long long sol;

int main()
{
    freopen("fractii.in","r",stdin);
    freopen("fractii.out","w",stdout);
    scanf("%d",&n);

    for (int i=2;i<=n;++i)
    {
        if (ciur[i]==0)
        {
            int j;
            if (1LL*i*i<=n)
            {
                j=i*i; while (j<=n) ciur[j]=1,j+=i;
            }
        }
    }

    for (int i=1;i<=n;++i) phi[i]=1;

    for (int i=2;i<=n;++i)
    {
        if (ciur[i]==0)
        {
            phi[i]=i-1;
            exp[i][1]=1; exp[i][0]=i;
            put[0]=1; int j=1; while ((put[j-1]*i)<=n) put[j]=put[j-1]*i,++j;
            j=2;
            int r=2*i;
            while (r<=n)
            {
                int v=0; if (exp[j][0]==i) v=exp[j][1];
                phi[r]*=put[v]*(i-1);
                exp[r][1]=v+1;
                exp[r][0]=i;
                ++j;
                r+=i;
            }
        }
    }

    for (int i=2;i<=n;++i) sol=sol+(1LL*phi[i]*2);
    sol++;

    cout<<sol;

    fclose(stdin);
    return 0;
}