Поиск

Задача из ЕГЭ


  • Tutorials MathJax.Hub.Config({ tex2jax: {inlineMath: [['$$$','$$$']], displayMath: [['$$$$$$','$$$$$$']]} });

    Для маленьких $$$N$$$, переберем начало последовательности, и будем складывать пока сумма не будет кратна $$$10^6$$$. Среди всех таких последовательностей выберем с наименьшей длиной и минимальным индексом. Но такое решение будет работать за $$$O(N^2)$$$, что при таких ограничения приводит к превышению времени работы.

    Давайте решим задачу при наших ограничениях. Рассмотрим частичные суммы элементов последовательности от ее начала до i-го элемента включительно. Так как нас интересуют остатки от деления суммы на 1000000 и из свойства остатков известно, что $$$(X+Y) mod M= ((X mod M) + (Y mod M)) mod M$$$, можно рассмотреть не сами суммы, а их остатки от деления. Так как нас интересует остаток равный 0, мы должны найти в последовательности остатков частичных сумм ближайшие одинаковые значения (если остатки одинаковы, значит остаток для суммы элементов подпоследовательности между ними равен 0). Для этого для каждого остатка нужно запоминать позицию, когда этот остаток встречался и находить минимальный вариант для разницы позиций.