1. Erste Version: JAVA, Gunaar Hage
/**
* ACM programming Contest WS 08/09 "294 - Divisors"
* Wrong answer 31.Okt.2008
* @author Gunnar Hage, AP5(IFB5A) Okt. 2008
*
* Aufgabe: http://icpcres.ecs.baylor.edu/onlinejudge/index.php?option=com_onlinejudge&page=show_problem&problem=230
*/
import java.io.*;
import java.util.*;

public class Main {
     public static void main(String[] args) {
        
         int[] primzahlen = getPrimzahlen((int)Math.sqrt(Integer.MAX_VALUE));
         long[][] inputValues = getInput();
       
         int exponent = 0;
         int produktOfExponentsPlusOne=1;
         int maxDivisors = 0;
         long maxDivisorsValue = 0;
         //Schleife über eingabezeilen
         for(int inputLine = 0; inputLine < inputValues.length; inputLine++){
             //Schleife über den eigegebenen Zahlenbereich
             for(long zahlen = inputValues[inputLine][0]; zahlen <= inputValues[inputLine][1];zahlen++){
                 long testzahl = zahlen;
                 //Schleife über alle Primzahlen < sqrt(2^31)
                 for(int primzahlIndex=0;primzahlIndex<primzahlen.length && testzahl!=1;primzahlIndex++){
                     if(testzahl%primzahlen[primzahlIndex]==0){
                         testzahl = testzahl/primzahlen[primzahlIndex];
                         exponent++;
                         primzahlIndex--;
                     }
                     else{
                         produktOfExponentsPlusOne*=exponent+1;
                         exponent=0;
                     }
                 }
                 produktOfExponentsPlusOne*=exponent+1;
                 exponent=0;
                 // Wenn noch mehr als 1 übrig ist, muss es eine Primzahl > Wurzel(2^31) geben.
                 if(testzahl > 1){
                     produktOfExponentsPlusOne*=2;
                 }
                 if(produktOfExponentsPlusOne > maxDivisors){
                     maxDivisors = produktOfExponentsPlusOne;
                     maxDivisorsValue = zahlen;
                 }
                 produktOfExponentsPlusOne = 1;
                 exponent = 0;
                 //Wenn die Zahl eine Quadratzahl ist, einen abziehen?!?
             }
             System.out.println("Between " + inputValues[inputLine][0] + " and " + inputValues[inputLine][1] + ", " + maxDivisorsValue + " has a maximum of " + maxDivisors +" divisors.");
             //System.out.println(System.currentTimeMillis());
         }
         //System.out.println(System.currentTimeMillis());
     }
     //liest nach Aufgabenspezifikation von der Standardeingabe.
     private static long[][] getInput() {
         StringTokenizer st;
         String line = ReadLn(255);
         st = new StringTokenizer(line);
         line = st.nextToken();
         int inputLineCount = Integer.parseInt(line);
        long[][]inputValues = new long[inputLineCount][2];
        
         // Erfassen der Eingabe
         for(int i=0;i<inputLineCount;i++){
             st = new StringTokenizer(ReadLn(255));
             int first = Integer.parseInt(st.nextToken());
             int secound = Integer.parseInt(st.nextToken());
             inputValues[i][0] = Math.min(first, secound);
             inputValues[i][1] = Math.max(first, secound);
         }// Eingabe Erfasst
        return inputValues;
    }
    
     //gibt ein IntArray mit allen Primzahlen bis zur oberen grenze zurück.
     public static int[] getPrimzahlen(int upperborder){
             boolean[] era = eratosthenes(upperborder);
            int[] primzahlen = new int[10000];
            int f=0;
            for(int i=0;i<era.length;i++)
                if(!era[i])
                    primzahlen[f++]= i;
            //Trimmt das Array
            int[] returnValue = new int[f];
            f=0;
            for(int prim: primzahlen)
                if(prim>0)
                    returnValue[f++] = prim;
           
            return returnValue;
        }
       
     public static boolean[] eratosthenes(int upperBorder){
            boolean[] gestrichen = new boolean[upperBorder];
            for(int i = 2; i < upperBorder; i++)
              gestrichen[i] = false;
           
            gestrichen[0] = true;
            gestrichen[1] = true;
            int i=2;
            while (i*i <= upperBorder){
              if (!gestrichen[i]){
                for(int j=i*i; j<upperBorder; j+=i)
                  gestrichen[j] = true;
              }
              i++;
            }
            return gestrichen;
    }   
     static String ReadLn (int maxLg)  // utility function to read from stdin
     {
         byte lin[] = new byte [maxLg];
         int lg = 0, car = -1;
         try
         {
             while (lg < maxLg)
             {
                 car = System.in.read();
                 if ((car < 0) || (car == '\n')) break;
                 lin [lg++] += car;
             }
         }
         catch (IOException e)
         {
             return (null);
         }
         if (car < 0) return (null);  // eof
         return (new String (lin, 0, lg));
     }
}