Cod sursa(job #1104520)

Utilizator ipopa69Iulian Popa ipopa69 Data 10 februarie 2014 20:43:47
Problema Fractii Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>

bool flag;
int primes[50000];

int isPrime(int x) {
    for (int d = 3; d * d <= x; d += 2)
        if (x % d == 0)
            return 0;
    return 1;
}


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;

    primes[++primes[0]] = 2;
    for (int i = 3; i <= n; i += 2)
        if (isPrime(i))
            primes[++primes[0]] = i;

    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;
}