s=[2] лишнее, на двойку и так уже всё проверено, достаточно
s=[].
В последнем
if занимательно смотреть на дублирование одинакового кода в обеих ветвях.
Зачем
sum и
sum_s до меня по прежнему не доходит.
Вместо
len(s) я бы завёл ещё переменную равную
len(s) в каждый момент времени и сравнивал с ней. Может быть выигрыш во времени. Увеличить её легко вместе с
s.append.
Формально условие
n<a неправильное, надо
n<=a, как раньше и было, это будет важно для простых величин
a (вдруг захотите в будущем посчитать не до 2 миллионов).
Разве допустимо выражение
s[-1]? А оно у вас в строке
n%s[i-1] обязательно будет, и не один раз. Да и
s[0] лично мне под вопросом, не знаю с чего (0 или 1) нумеруются списки в питоне.
Ну и плюс неправильное условие остановки в самом конце, из-за чего и сумма неправильная. Эта же причина и в предыдущем коде была.
PS. Проверять правильность кода можно для
a=10, уже тут будет ошибка суммы, а время экономится.