1.
/*
* ACM Contest training
* Problem: 11466 - Largest Prime Divisor
* Link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=26&problem=2461&mosmsg=Submission+received+with+ID+8383065
*
* @author Christoph Goettschkes
* @version 1.0, 11/08/2010
*
* Method : Sieve of Eratosthenes
* Status : Accepted
* Runtime: 1.388
*/
import java.io.*;
import java.util.*;
class Main
{
static List<Integer> primes = new LinkedList<Integer>();
public static void main(String[] args) throws IOException
{
// max input has not more than 14 digits. Math.sqrt(10**14-1) = 9999999.9...
sieve(9999999);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
long cur = Long.parseLong(reader.readLine());
while (cur != 0) {
if (cur == 1 || cur == -1)
System.out.println(-1);
else
System.out.println(factor(Math.abs(cur)));
cur = Long.parseLong(reader.readLine());
}
}
public static long factor(long n)
{
Set<Long> set = new HashSet<Long>();
for(int p : primes) {
while (n % p == 0) {
set.add((long)p);
n /= p;
}
if (p > n)
break;
}
if (n > 1)
set.add(n);
return set.size() == 1 ? -1 : Collections.max(set);
}
public static void sieve(int upperBound) {
long last = 0;
long upperBoundSquareRoot = (int) Math.sqrt(upperBound);
BitSet isComposite = new BitSet(upperBound);
for (long m = 2; m <= upperBoundSquareRoot; m++) {
if (!isComposite.get((int)m)) {
primes.add((int)m);
last = m;
for (long k = m * m; k <= upperBound; k += m) {
isComposite.set((int)k, true);
}
}
}
if (upperBoundSquareRoot == last)
upperBoundSquareRoot++;
for (int m = (int)upperBoundSquareRoot; m <= upperBound; m++) {
if (!isComposite.get(m)) {
primes.add(m);
}
}
}
}