Естественно: ведь я беру новую матрицу с переставленными тройкой и единицей, хотя

не должно меняться.
Пример приведите, пожалуйста.
-- 24 ноя 2014, 16:57 --But I claim that the algorithm of whitefox is not O(1) but O(Log(N))=O(Log(N^2)) as I wrote before.
In fact, Whitefox' algorithm is O(1) for computing the score of swapping a pair.
But the swapping requires to update at most 29+23 products, for example when swapping 720 and 672 on a 27x27 grid.
So the algorithm is indeed O(1+log(n))
Можно

не хранить, а вычислять в процессе вычисления

При этом хранить

и обновлять их при фактическом выполнении обмена

В этом случае сложность вычисления

и сложность пересчёта

будет пропорциональна числу делителей

и

то есть в среднем

Да можно и так. Но как вы правильно заметили обмен происходит редко и поэтому ваш оригинальный О(1) метод для
быстрее.