#include long gcd(long x, long y); long log_base2(unsigned long long num); #define MAX 2000000 #define NUMPRIMES 148950 #define SIEVE 250050 long 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; }