Cod sursa(job #1741174)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 13 august 2016 11:19:58
Problema Fractii Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <cmath>
using namespace std;
const int MAXN = 1000;
const int MAXP = 168;
bool c[MAXN + 5];
int prime[MAXP + 5];
void ciur(int n){
    int rad, i, j;
    rad = sqrt(n);
    c[0] = c[1] = 1;
    for (i = 4; i <= n; i += 2)
        c[i] = 1;
    for (i = 3; i <= rad; i += 2)
        if (!c[i])
            for (j = i * i; j <= n; j += 2 * i)
                c[j] = 1;
}
void numere_prime(int n, int &k){
    int i;
    ciur(n);
    prime[1] = 2;
    for (i = 3; i <= n; i ++)
        if (!c[i])
            prime[++k] = i;
}
int mypow(int a, int b){
    int ans = 1;
    for (; b; b >>= 1){
        if (b & 1)
            ans *= a;
        a *= a;
    }
    return ans;
}
int euler(int n, int k){
    int p, e, d;
    d = p = 1;
    while (prime[d] * prime[d] <= n && d <= k){
        e = 0;
        while (n % prime[d] == 0){
            n /= prime[d];
            e ++;
        }
        if (e)
            p *= (prime[d] - 1) * mypow(prime[d], e - 1);
        d ++;
    }
    if (n > 1)
        p *= (n - 1);
    return p;
}
int main(){
    freopen("fractii.in", "r", stdin);
    freopen("fractii.out", "w", stdout);
    int n, i, k = 1;
    long long s = 0;
    scanf("%d", &n);
    numere_prime(sqrt(n), k);
    for (i = 1; i <= n; i ++)
        s += euler(i, k);
    printf("%lld\n", 2 * s - 1);
    return 0;
}