Cod sursa(job #2415133)

Utilizator robertrRotaru Stefan Robert robertr Data 25 aprilie 2019 16:04:48
Problema Fractii Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 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[1000001][8];
long long dp[1000005];
void ciurul()
{
    for(int i=2;i<=xmax;i++)
        if(!prim[i][1])
            {
                for(int j=i+i;j<=xmax;j+=i) prim[j][++prim[j][0]]=i;
                prim[i][1]=i;
                prim[i][0]=1;
            }
}
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)
{
    long long sol=1;
    int nr=prim[x][0],aux=x;
    for(int i=1;i<=nr;i++)
    {
        int p=0;
        while(aux%prim[x][i]==0&&x>1)
            aux/=prim[x][i],p++;
        sol*=(prim[x][i]-1)*(putlog(prim[x][i],p-1));
    }
    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;
}