• Как найти такие 2 числа в последовательности, сумма которых будет кратна m?

    @noqwerty
    Будем полагать, что элементы x[1],..., x[n] введенной последовательности хранятся в памяти с произвольным доступом. После ввода числа M выполняем вычисление рекуррентной последовательности y[i+1]=Mod(-M+y[g(y[i])]), где g некоторое легковычислимое отображение множества возможных значений элементов x[1],..., x[n] в множество 1,2,...,n. Далее алгоритмом Флойда определения периода находится коллизия y[i1]= y[i2]=Mod(-M+y[g(y[i2-1])]). Тогда сумма y[i1]+y[g(y[i2-1])] делится на M. Временная сложность оценивается O(Sqrt(M)) .
    Ответ написан
    Комментировать