Из кулуаров олимпиады по программированию
Феерическое читерство
Рассказ слышал от одного из ребят. Итак, задача: даны два числа
k<n<10^6. Вывести в выходной файл число n, равное количеству простых чилел, лежащих между k и n.
Ограничение на память стандартное - 64Мбайт, на время работы - 2 с. Причем эксперимент показывает, что пересылка в памяти 10^8 элементов массива в тот же или другой массив занимает около 1 с, т.е. алгоритм, требующий порядка
n * n^0,5 операций (т.е. 10^9) не проходит ограничение по времени.
Внезапно одна из команд сдает решение, которое выполняется малые доли секунды и на всех тестах дает правильный ответ. Жюри в недоумении и обращается к исходному тексту программы (правила предполагают, что на тестирование сдается исходный код, который компилируется на компиляторе командной строки и потом запускается на тестах). Недоразумение развеивается.
1. Что увидело жюри, открыв файл программы?
2. Какое решение имело в виду жюри?
Комменты пока скрываются.
no subject
1. return floor(n/log(n) - k/log(k));
Точнее, надо бы брать целое число, ближайшее к x, - не помню, как это зовется.
2. Если n мало (например, < 10^5), то рисуем решето Эратосфена. Иначе чтобы успеть, k должно быть близко к n, и проверяем на простоту все числа от k до n, сравнимые с +-1 mod 6.