<?php

// for PHP 5.3 or later

function primes($upto, $func){
   if( $upto > 25000 ){ return large_primes($upto, $func); }
   $upto -= 1;
   $flags = array_fill(0, $upto-1, true);
   for( $i = 0; $i < $upto; $i++ ){
      if( $flags[$i] ){
         $prime = $i + 2;
         $k = $i + $prime;
         while( $k < $upto ){
            $flags[$k] = false;
            $k += $prime;
         }
         $func($prime);
      }
   }
}

function large_primes($upto, $func){
   // The Algorithm is adapted from http://w...content-available-to-author-only...k.com/~jrm/printprimes.html
   // This code is a translated version of Andreas Raab's #largePrimesUpTo:do: method
   // which was written for the Squeak Smalltalk environment.

   $idx_limit = floor(sqrt($upto)) + 1;
   $flags = array_fill(0, floor(($upto + 2309) / 2310) * 60 + 60, 0xFF);
   $primes_up_to_2310 = array();
   primes(2310, function($p) use(&$primes_up_to_2310){ array_push($primes_up_to_2310, $p); });
   $mask_bit_idx = array_fill(0, 2310, 0);
   $mask_bit_idx[0] = 0;
   $mask_bit_idx[1] = 1;
   $bit_idx = 1;
   for( $i = 0; $i < 5; $i++ ){ $func($primes_up_to_2310[$i]); }
   $idx = 5;
   for( $n = 2; $n < 2310; $n++ ){
      while( $primes_up_to_2310[$idx] < $n ){ $idx++; }
      if( $n == $primes_up_to_2310[$idx] ){
         $mask_bit_idx[$n] = ++$bit_idx;
      } else if( $n % 2 == 0 || $n % 3 == 0 || $n % 5 == 0 || $n % 7 == 0 || $n % 11 == 0 ){
         $mask_bit_idx[$n] = 0;
      } else {
         $mask_bit_idx[$n] = ++$bit_idx;
      }
   }
   for( $n = 13; $n <= $upto; $n += 2 ){
      if( $mask_bit = $mask_bit_idx[$n % 2310] ){
         $byte_idx = floor($n / 2310) * 60 + ($mask_bit-1 >> 3);
         $bit_idx = 1 << ($mask_bit & 7);
         if( $flags[$byte_idx] & $bit_idx ){
            $func($n);
            if( $n < $idx_limit ){
               $idx = $n * $n;
               if( !($idx & 1) ){ $idx += $n; }
               while( $idx <= $upto ){
                  if( $mask_bit = $mask_bit_idx[$idx % 2310] ){
                     $byte_idx = floor($idx / 2310) * 60 + ($mask_bit-1 >> 3);
                     $mask_bit = 255 - (1 << ($mask_bit & 7));
                     $flags[$byte_idx] = $flags[$byte_idx] & $mask_bit;
                  }
                  $idx += 2 * $n;
               }
            }
         }
      }
   }
}

$max = intval($argv[1]);
if( !$max ){ $max = 100; }
$q = $c = 0;
primes($max, function($p) use(&$q, &$c){ $q = $p; $c++; });
echo $q, " ", $c;
