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

 не должно меняться.
Пример приведите, пожалуйста.
-- 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) метод для 
 быстрее.