Cod sursa(job #1875270)

Utilizator dianamariaDiana Cataros dianamaria Data 10 februarie 2017 21:56:24
Problema Fractii Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <fstream>

using namespace std;
ifstream in ("fractii.in");
ofstream out ("fractii.out");
bool v[1000001];
int p[10000];
int main()
{
    int n,i,j,nr=0,ci;
    long double fr;
    unsigned long long ans=1;
    in>>n;
    for (i=2;i<=n;i++)
        if (v[i]==0)
            for (j=2*i;j<=n;j+=i)
                v[j]=1;
    for (i=2;i<=n;i++)
    {
        if (v[i]==0)
        {
            nr++;
            p[nr]=i;
        }
    }
    for (i=2;i<=n;i++)
    {
        ci=i;
        if (v[i]==0)
            ans+=(ci-1)*2;
        else
        {
            fr=i;
            for (j=1;p[j]*p[j]<=ci;j++)
                if (i%p[j]==0)
                {
                    fr=(fr/p[j])*(p[j]-1);
                    while (ci%p[j]==0)
                        ci/=p[j];
                }
            if (ci>1)
                fr=(fr/ci)*(ci-1);
            //out<<"pentru "<<i<<" indicatorul lui Euler este "<<fr<<'\n';
            ans+=fr*2;
        }
    }
    out<<ans;
    return 0;
}