January 2019

M T W T F S S
 123456
78 910111213
14 151617181920
21222324252627
28293031   

За стиль благодарить

Развернуть метки

No cut tags
Tuesday, November 27th, 2007 10:44 pm

Феерическое читерство



Рассказ слышал от одного из ребят. Итак, задача: даны два числа
k<n<10^6. Вывести в выходной файл число n, равное количеству простых чилел, лежащих между k и n.

Ограничение на память стандартное - 64Мбайт, на время работы - 2 с. Причем эксперимент показывает, что пересылка в памяти 10^8 элементов массива в тот же или другой массив занимает около 1 с, т.е. алгоритм, требующий порядка
n * n^0,5 операций (т.е. 10^9) не проходит ограничение по времени.

Внезапно одна из команд сдает решение, которое выполняется малые доли секунды и на всех тестах дает правильный ответ. Жюри в недоумении и обращается к исходному тексту программы (правила предполагают, что на тестирование сдается исходный код, который компилируется на компиляторе командной строки и потом запускается на тестах). Недоразумение развеивается.

1. Что увидело жюри, открыв файл программы?

2. Какое решение имело в виду жюри?

Комменты пока скрываются.

Tuesday, November 27th, 2007 10:26 pm (UTC)
2) Прошу прощения, сглючил. Поскольку простых чисел порядка n/ln(n), то можно делать так: проверять все числа с остатками 1 и 5 при делении на 6 (т.е. n/3 чисел) на делимость на все уже известные простые числа, меньшие \sqrt{n} (которых примерно sqrt(n) / ln(sqrt(n))).
В итоге получаем:
n/3 * (sqrt(n) / (ln(n)/2)) = 2/3 * n^1.5 / ln(n), что есть 10/9 * 10^8.