Используйте сито Эратосфена .
Это сегментированное сито Эратосфена, модифицированное для работы только с одним сегментом, согласно вашим входным данным.
Разница в том, что сегментированное сито проходит по сегментам бесконечно и использует столько простых чисел, сколько необходимо для текущего просеиваемого сегмента (до его квадрат верхнего предела root); здесь предел верхнего сегмента (и, следовательно, основного сегмента) известен заранее.
Основной сегмент простирается до sqrt
самого большого значения, которое необходимо учитывать; здесь он указан как 10^9
. sqrt(10^9) < 32000
, поэтому сегмент ядра охватывает от 0 до 32000 и просеивается простым ситом Эратосфена.
Поскольку у вас несколько прогонов, используйте одно и то же ядро для каждого прогона.
код в связанном ответе легко изменить в соответствии с требованиями этого вопроса: вместо оценки значения top
просто используйте n
, предоставленное вам во входных данных. above
- это то, что здесь называется m
.