1.
/*
* ACM Contest training
* Problem: 11099 - Next Same-Factored
* Link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=22&problem=2040
*
* @author Christoph Goettschkes
* @version 1.0, 12/08/2010
*
* Method : Sieve of eratosthenes, prime factorization, dynamic programming
* Status : Accepted
* Runtime: 1.748
*/
import java.util.*;
import java.io.*;
class Main {
static int[] primes;
static int curNumber;
static long curEnd;
static long curResult;
static Set<Integer> curSet;
static HashMap<Integer, Long> answers = new HashMap<Integer, Long>();
public static void main(String[] args) throws Exception {
primes = sieve(1000000);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
StringBuilder string = new StringBuilder();
do
{
int n = Integer.parseInt(reader.readLine());
long answer;
if (n == 1)
answer = 3000000;
else
answer = test(n);
if (answer > 2000000)
string.append("Not Exist!\n");
else
string.append(answer + "\n");
} while(reader.ready());
System.out.print(string);
}
static long test(int n) {
if (answers.containsKey(n))
return answers.get(n);
curNumber = n;
List<Integer> facs = factorize(curNumber);
curSet = new HashSet<Integer>(facs);
curEnd = curNumber * facs.get(0);
curResult = Integer.MAX_VALUE;
long start = 1;
for (int i : curSet)
start *= i;
calc(start);
answers.put(n, curResult);
return curResult;
}
static void calc(long n) {
if (n > curEnd || n > curResult)
return;
if (n < curResult && n > curNumber)
curResult = n;
for (int i : curSet) {
calc(n * i);
}
}
public static List<Integer> factorize(int n) {
List<Integer> facs = new ArrayList<Integer>();
int primeKey = 0;
while (n > 1)
{
int curPrime = primes[primeKey];
while (n % curPrime == 0) {
facs.add(curPrime);
n /= curPrime;
}
primeKey++;
}
return facs;
}
public static int[] sieve(int upperBound) {
int upperBoundSquareRoot = (int)Math.sqrt(upperBound);
List<Integer> primes = new ArrayList<Integer>();
BitSet sieve = new BitSet(upperBound + 1);
for (int m = 2; m <= upperBoundSquareRoot; m++)
if (!sieve.get(m))
for (int k = m*m; k <= upperBound; k += m)
sieve.set(k, true);
for (int m = 2; m <= upperBound; m++)
if (!sieve.get(m))
primes.add(m);
int[] ret = new int[primes.size()];
int key = 0;
for (int i : primes)
ret[key++] = i;
return ret;
}
}
2.
/**
* FWP: Ausgewaehlte Probleme aus dem ACM (SS10)
*
* Method: Math: Primes
* Problem: 11099 - NextSameFactored
* Accepted: 2.588
* @author Evgeni Pavlidis
*
*/
import java.io.*;
import java.util.*;
class Main {
// debugging
private static boolean DEBUG = false;
private static Stack<Integer> stack = new Stack<Integer>();
private static final int MAX = 1000000;
private static final int LIMIT = 2000000;
private static boolean[] isPrime = new boolean[MAX+1];
// saves the prime factors for [x][...]
private static int[][] factors = new int[MAX+1][7];
// saves the number of prime factors for [x]
private static int[] index = new int[MAX+1];
// saves the minimum next number found so far
private static long min;
private static void sievePrimes()
{
isPrime[2] = true;
factors[2][index[2]++] = 2;
for(int j = 4; j <= MAX; j+=2)
factors[j][index[j]++] = 2;
for(int i = 3; i <= MAX; i+=2)
isPrime[i] = true;
int root = (int)Math.sqrt(MAX);
for(int i = 3; i <= root; i+=2)
if(isPrime[i])
for(int j = i+i; j <= MAX; j+=i)
{
isPrime[j] = false;
factors[j][index[j]++] = i;
}
}
private static void findNext(int n, long current)
{
if(current > min || current >= LIMIT)
return;
if(current > n)
min = current;
// go through all prime factors
for(int i = 0; i < index[n]; i++)
{
current = current * factors[n][i];
if(DEBUG)
{
stack.push(factors[n][i]);
System.out.println(stack + " ==> " + current);
}
findNext(n, current);
current = current / factors[n][i];
if(DEBUG)
stack.pop();
}
}
private static long getNextPrime(int n)
{
long base = 1;
long next;
// tests if n contains a prime that wasn't sieved
int test = n;
for(int i = 0; i < index[n]; i++)
{
while( test % factors[n][i] == 0 )
test /= factors[n][i];
base *= factors[n][i];
}
if(test != 1)
{
factors[n][index[n]++] = test;
base *= test;
}
if(DEBUG)
{
System.out.println("Factors: " + Arrays.toString(factors[n]));
stack.clear();
}
min = n*factors[n][0];
findNext(n, base);
return min;
}
public static void main(String...args) throws Exception
{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String input;
int n;
long next;
sievePrimes();
while( (input = reader.readLine()) != null )
{
n = Integer.parseInt(input);
// special case
if(n == 1)
{
System.out.println("Not Exist!");
continue;
}
if(isPrime[n])
next = (long)n*n;
else
next = getNextPrime(n);
if(next > LIMIT)
System.out.println("Not Exist!");
else
System.out.println(next);
}
}
}