Cod sursa(job #1104529)

Utilizator ipopa69Iulian Popa ipopa69 Data 10 februarie 2014 20:48:18
Problema Fractii Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <stdio.h>

bool flag;
int c[1000100], primes[1000100];

int ciur(int x) {
    for (int i = 2; i * i <= x; ++i)
        if (c[i] == 0)
            for (int j = i + i; j <= x; j += i)
                c[j] = 1;
    for (int i = 2; i <= x; ++i)
        if (!c[i])
            primes[++primes[0]] = i;
}


int desc(int x) {
    int res = 0;
    flag = 1;
    for (int i = 1; primes[i] * primes[i] <= x; ++i) {
        int pw = 0, d = primes[i];
        while (x % d == 0) {
            x /= d;
            ++pw;
        }
        if (pw > 1) {
            flag = 0;
            return 0;
        }
        res += pw;
    }
    if (x > 1)
        ++res;
    return res;
}

int main() {
    freopen("fractii.in", "r", stdin);
    freopen("fractii.out", "w", stdout);

    int n;
    scanf("%d", &n);
    long long tot = 1LL * n * n;

    ciur(n);

    for (int i = 2; i <= n; ++i)
        if (desc(i) % 2 && flag)
            tot -= 1LL * (n / i) * (n / i);
        else if (flag)
            tot += 1LL * (n / i) * (n / i);

    printf("%lld", tot);
    return 0;
}