Cod sursa(job #2172137)

Utilizator AndreiVisoiuAndrei Visoiu AndreiVisoiu Data 15 martie 2018 15:14:41
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>
#include <bitset>

using namespace std;

ifstream in("fractii.in");
ofstream out("fractii.out");

//bitset<1000002> p;

unsigned long long eul[1000001], i, n, j, fr;
/*int putere(int x, int y) {
    if(y < 0) x = 1/x, y = -y;
    else if(y == 0) return 1;
    else {
        int k = 1;
        while(y > 1) {
            if(y%2 ==0) {
                x = x*x;
                y = y/2;
            } else {
                k = x*k;
                x = x*x;
                y = (y-1)/2;
            }
        }
        return x*k;
    }
}*/

void euler() {
    /*eul[1] = 1; eul[2] = 1; eul[3] = 2;
    for(int m = 3; m <= n; m++) {
        int x = m;

        if(x == 1) eul[x] = 1;
        else if(p.test(x) == 0) eul[x] = x-1;
        else {
            int d = 2, p = 0, e = 1;
            while(x > 1) {
                p = 0;
                while(x%d==0) {
                    x = x/d;
                    p++;
                }

                if(p!=0) e = e*(d-1)*putere(d, p-1);
                d++;
            }
            eul[m] = e;
        }
        fr += eul[m];
    }*/
    /*for (i = 1; i <= n; ++i) eul[i] = i-1, fr += i-1;
    for (i = 2; i <= n; ++i) {
        for (j = 2*i; j <= n; j += i) eul[j] -= eul[i], fr -= eul[i];
    }*/

    for (int i=1;i<=n;i++) eul[i]=i;
    for (int i=2;i<=n;i++) {
        if (eul[i]==i) for (j=i;j<=n;j+=i) eul[j] /=i, eul[j] *= (i-1);
    }
}

int main()
{
    in >> n;
    /*p.set(1, 1);
    for(i = 2; i*i <= n; i++) {
        if(p.test(i) == 0) for(j = i*i; j <= n; j = j+i) p.set(j, 1);
    }*/

    euler();
    for (int i=2;i<=n;i++) fr += eul[i];
    out << fr*2 + 1;
    return 0;
}