Cod sursa(job #2414932)

Utilizator robertrRotaru Stefan Robert robertr Data 25 aprilie 2019 12:19:28
Problema Fractii Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>
#include <string.h>
#include <cmath>
#define xmax 1000000
using namespace std;
ifstream f("fractii.in");
ofstream g("fractii.out");
int n,prim[xmax];
long long dp[1000005];
bool b[1000005];
void ciurul()
{
    for(int i=2;i<=xmax;i++)
        if(!b[i])
    {
        for(int j=i+i;j<=xmax;j+=i) b[j]=1;
        prim[++prim[0]]=i;
    }
}
long long putlog(int b,int a)
{
    long long r=1;
    while(a)
    {
        if(a&1)
            r=(1LL*r*b);
        b=(1LL*b*b);
        a/=2;
    }
    return r;
}
long long indicator(int x)
{
    int i1=1;
    long long sol=1;
    while(x>1)
    {
        if(x%prim[i1]==0)
        {
            int p=0;
            while(x%prim[i1]==0)
                x/=prim[i1],p++;
            sol*=(prim[i1]-1)*(putlog(prim[i1],p-1));
        }
        i1++;
    }
    return sol;
}
int main()
{
    f>>n;
    ciurul();
    if(n==1)
    {
        g<<1<<'\n';
        return 0;
    }
    if(n==2)
    {
        g<<3<<'\n';
        return 0;
    }
    dp[1]=1;
    dp[2]=3;
    for(int i=3;i<=n;i++)
        dp[i]=dp[i-1]+2*indicator(i);
    g<<dp[n]<<'\n';
    return 0;
}