Cod sursa(job #2404551)

Utilizator mirceamaierean41Mircea Maierean mirceamaierean41 Data 13 aprilie 2019 00:25:37
Problema Fractii Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
#include <bitset>
#define NMAX 1000000
using namespace std;
ifstream cin("fractii.in");
ofstream cout("fractii.out");
int rl(int n,int p)
{
    int nr=1;
    while(p>0)
    {
        if(p%21)
        {
            nr*=n;
            --p;
        }
        else
        {
            n*=n;
            p/=2;
        }
    }
    return nr;
}
bitset<NMAX+5> ciur;
int main()
{
    int n;
    cin>>n;
    for(int i=4; i<=n; i+=2) ciur[i]=1;
    for(int i=3; i<=n/2; i+=2)
        if(ciur[i]==0)
            for(int j=i+i; j<=n; j+=i)
                ciur[j]=1;
    long cnt=1;
    for(int i=2; i<=n; ++i)
    {
        long eul=1;
        if(ciur[i]==0) eul=i-1;
        else
        {
            int cop=i,d=3,p=0;
            while(cop%2==0)
            {
                ++p;
                cop/=2;
            }
            if(p) eul=rl(2,p-1);
            while(cop>1)
            {
                p=0;
                while(cop%d==0)
                {
                    ++p;
                    cop/=d;
                }
                if(p) eul*=(d-1)*rl(d,p-1);
                d+=2;
            }
        }
        cnt+=2*eul;
    }
    cout<<cnt;
    return 0;
}