All pastes #77993 Raw Edit

Untitled

public c v1 · immutable
·published 2006-07-03 17:46 UTC
rendered paste body
#include <stdio.h>long gcd(long x, long y);long log_base2(unsigned long long num);#define MAX 2000000#define NUMPRIMES    148950#define    SIEVE        250050long primes[NUMPRIMES];    /* list of primes */char bitArray[SIEVE];            /* bit array for checking off primes */long primePos = 1;        /* statically 0 = 2 and 1 = 3 */void sieve(unsigned long maxPrime){    long i, temp;    primes[0] = 2, primes[1] = 3; bitArray[0] = 169;    temp = maxPrime>>3;    for(i = 1 ; i <= temp ; i += 3) {        bitArray[i]     = 171; bitArray[i+1]     = 186; bitArray[i+2]     = 174;    }    while(primes[primePos] < maxPrime) {        for(i = primes[primePos]+1 ; i <= maxPrime ; i++)            if( !( bitArray[ (i-1) >> 3 ] & (1<<( (i-1) & 7 )) ) )                break;    /* Next prime has been reached */        primes[++primePos] = temp = i;        for(i = temp ; i <= maxPrime ; i += temp+temp)            bitArray[ (i-1) >> 3 ] |= ( 1 << ( (i-1) & 7 ) );    }}long log_base2(unsigned long long num){    unsigned long long prod = 1;    long i;    for(i = 0 ;  ; i++) {        if(prod >= num)            break;        prod <<= 1;    }    return i;}int main(){    long n;    long i, j, temp;    unsigned long long count = 0;    long totients[MAX];    sieve(2000000);    scanf("%ld", &n);    for(i = 0 ; i <= n ; i++) totients[i] = i;    for(i = 0 ; primes[i] <= n ; i++) totients[primes[i]] = primes[i]-1;    for(i = 0 ; (temp=primes[i]+primes[i]) <= n ; i++) {        for(j = temp ; j <= n ; j+=primes[i]) {            totients[j] /= primes[i];            totients[j] *= (primes[i]-1);        }    }    for(i = 2 ; i <= n ; i++) {        count += (unsigned long long)totients[i];    }    printf("%ld", log_base2(count));    return 0;}