Эта проблема требует реализации Segmented Sieve. Простое сегментированное Сито Эратосфена может быть легко запрограммировано в C / C ++ примерно в 50-60 строк кода.
Если вы внедрили сегментированное сито, вам нужно выделить память только для сегмента максимального размера, упомянутого в проблеме.
Есть несколько других оптимизаций, которые могут немного помочь. Я перечислю те, которые я сделал в моем решении:
Проверка на кратность только простых чисел вплоть до квадратного корня из максимального числа.
Массив поиска всех простых чисел до квадратного корня максимально возможного числа, т. Е. Sqrt (10 ^ 9), может быть предварительно рассчитан и добавлен в исходный код. Ограничение размера исходного кода SPOJ составляет 50000 байт для этой проблемы, и добавление этого поискового массива все еще вписывается в этот предел размера.
Вычеркивая кратные, начните с y = i * i, но отметьте только нечетные кратные i.
С этими оптимизациями мой код на C ++ работал примерно за 0,05 с. Даже без них
оптимизация, я думаю, что сегментированное сито должно быть принято. Надеюсь, это поможет.