Cod sursa(job #492523)

Utilizator cont_de_testeCont Teste cont_de_teste Data 14 octombrie 2010 21:01:52
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
# include <fstream>
# include <cstring>
# include <cmath>
using namespace std;

unsigned char V[1 << 17];
int P[1241] ;

void prec ( void ) {

    for (int i = 1; ( i * i << 1 ) + ( i << 1 ) <= 1000; ++i) {
        if ( ( V[i >> 3] & ( 1 << ( i & 7 ) ) ) ) {
            continue;
        }
        for (int j = ( i * i << 1 ) + ( i << 1 ); ( j << 1 ) + 1 <= 1000; j += ( i << 1 ) + 1) {
            V[j >> 3] |= ( 1 << ( j & 7 ) );
        }

    }


    P[ ++P[0] ] = 2 ;

    for (int i = 1; ( i << 1 ) + 1 <= 1000; ++i) {
        if ( ( V[i >> 3] & ( 1 << ( i & 7 ) ) ) == 0 ) {
            P[ ++P[0] ] = ( i << 1 ) + 1 ;
        }
    }
}

int fi(int n) {
    int result = n;
    for(int i = 1; P[i]*P[i] <= n && i <= P[0]; i++) {
        if (n % P[i] == 0) result -= result / P[i];
        while (n % P[i] == 0) n /= P[i];
    }
    if (n > 1) result -= result / n;
    return result;
}

int main() {
    int n ;
    long long nr  = 0;
    prec () ;
    fscanf ( fopen ( "fractii.in", "r" ) , "%d", &n ) ;
    for (int i=2; i<=n; i++)
        nr += fi ( i ) ;
    fprintf ( fopen ( "fractii.out", "w" ), "%lld", nr * 2 + 1 ) ;
    return 0;
}