Товарищи, в процессе подготовки одной задачки я обнаружил странное поведение следующей программы на серверах Codeforces.
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Primorial {
public static void main(String[] args) throws Exception {
int n = Integer.parseInt(new BufferedReader(new InputStreamReader(System.in)).readLine());
BigInteger primorial = BigInteger.ONE;
BigInteger prime = BigInteger.ONE;
for (int i = 1; i < n; ++i) {
prime = prime.nextProbablePrime();
primorial = primorial.multiply(prime);
}
System.out.println(primorial);
}
}
Для n = 5 этот код выполняется примерно за 30 миллисекунд, а для n = 6 уже примерно за 5 секунд. Это верно как для шестой джавы, так и для седьмой. Проверял как на полигоне, так и в форме запуска на Codeforces. Результат печальный.
2310 ===== Использовано: 5038 мс, 1080 КБ
То есть целых 5 секунд тратится на понимание того, что следующее за семёркой простое число — 11. Между тем у меня на локальном компьютере, а также в других местах такая программа работает быстро.
Единственное объяснение, которое я могу предложить, — что это как-то связано с использованием java.security.SecureRandom. Но нормально ли это, как по-вашему? Ведь метод довольно хитрый и участники могут воспользоваться им во время раундов. Должен ли он себя так вести?







