3. Пересчитать только суммы которые имеют общий делитель с i или k. Таких будет
![$(|M^i|-1)+(|M^k|-1)$ $(|M^i|-1)+(|M^k|-1)$](https://dxdy-02.korotkov.co.uk/f/5/f/0/5f0f2cc4199b31e9b34f19c60d0a5f1382.png)
, где
![$i \in M^i,~k \in M^k$ $i \in M^i,~k \in M^k$](https://dxdy-03.korotkov.co.uk/f/6/a/6/6a6a795efce4f2496013bddd12d9fd9e82.png)
. В худшем случае i и k делятся на 2 и
![$|M^i|=|M^k|=\frac{N^2}{2}$ $|M^i|=|M^k|=\frac{N^2}{2}$](https://dxdy-03.korotkov.co.uk/f/e/8/2/e8275e768d7f9f21378804e61b24423082.png)
. Это примерно в
![$\frac{N^2}{2}$ $\frac{N^2}{2}$](https://dxdy-04.korotkov.co.uk/f/f/9/7/f97c1a43186c0257a4914ddce10d9cda82.png)
быстрее первого метода и в 2 раза быстрее второго метода.
Если поменять местами числа
![$a$ $a$](https://dxdy-01.korotkov.co.uk/f/4/4/b/44bc9d542a92714cac84e01cbbb7fd6182.png)
и
![$b$ $b$](https://dxdy-01.korotkov.co.uk/f/4/b/d/4bdc8d9bcfb35e1c9bfb51fc69687dfc82.png)
, то изменение числа Делакорта вычисляется по формуле:
![$$\Delta D=A-B-2C_x-2C_y$$ $$A=\left(x^2_b-x^2_a+y^2_b-y^2_a\right)\left(\Phi(a)-\Phi(b)\right)$$ $$B=\left((x_b-x_a)^2+(y_b-y_a)^2\right)(a+b-2\gcd(a,b))$$ $$C_x=(x_b-x_a)\left(\Psi_x(a)-\Psi_x(b)\right)$$ $$C_y=(y_b-y_a)\left(\Psi_y(a)-\Psi_y(b)\right)$$ $$\Phi(m)=\sum\limits_{k\mid m}\varphi(k)\left\lfloor\frac{n^2}k\right\rfloor$$ $$\Psi_x(m)=\sum\limits_{k\mid m}\varphi(k)X_k$$ $$\Psi_y(m)=\sum\limits_{k\mid m}\varphi(k)Y_k$$ $$X_k=\sum\limits_{i\in M_k}x_i$$ $$Y_k=\sum\limits_{i\in M_k}y_i$$ $$\Delta D=A-B-2C_x-2C_y$$ $$A=\left(x^2_b-x^2_a+y^2_b-y^2_a\right)\left(\Phi(a)-\Phi(b)\right)$$ $$B=\left((x_b-x_a)^2+(y_b-y_a)^2\right)(a+b-2\gcd(a,b))$$ $$C_x=(x_b-x_a)\left(\Psi_x(a)-\Psi_x(b)\right)$$ $$C_y=(y_b-y_a)\left(\Psi_y(a)-\Psi_y(b)\right)$$ $$\Phi(m)=\sum\limits_{k\mid m}\varphi(k)\left\lfloor\frac{n^2}k\right\rfloor$$ $$\Psi_x(m)=\sum\limits_{k\mid m}\varphi(k)X_k$$ $$\Psi_y(m)=\sum\limits_{k\mid m}\varphi(k)Y_k$$ $$X_k=\sum\limits_{i\in M_k}x_i$$ $$Y_k=\sum\limits_{i\in M_k}y_i$$](https://dxdy-01.korotkov.co.uk/f/8/b/2/8b28297efa83fd8b6655f1d8d926454382.png)
Все числа
![$\Phi(m),\gcd(a,b)$ $\Phi(m),\gcd(a,b)$](https://dxdy-03.korotkov.co.uk/f/e/5/2/e520fce3670c5ea7189e09599426154682.png)
являются константами и вычислены заранее.
При вычислении
![$\Delta D$ $\Delta D$](https://dxdy-04.korotkov.co.uk/f/b/8/a/b8aef87d1daec1035b0511383792779782.png)
используются текущие значения
![$\Psi_x(a),\Psi_y(a),\Psi_x(b),\Psi_y(b).$ $\Psi_x(a),\Psi_y(a),\Psi_x(b),\Psi_y(b).$](https://dxdy-02.korotkov.co.uk/f/9/3/3/933f10dadb65c713352035562d9a442282.png)
После фактического выполнения обмена
![$a\leftrightarrow b$ $a\leftrightarrow b$](https://dxdy-03.korotkov.co.uk/f/a/6/9/a697a2987a2dbb4e212add237662685082.png)
новые значения
![$\Psi_x,\Psi_y$ $\Psi_x,\Psi_y$](https://dxdy-02.korotkov.co.uk/f/9/2/4/9246b836390700e09aea60e2ac44ace182.png)
для всех
![$m$ $m$](https://dxdy-01.korotkov.co.uk/f/0/e/5/0e51a2dede42189d77627c4d742822c382.png)
таких, что
![$\gcd(m,a)\ne\gcd(m,b)$ $\gcd(m,a)\ne\gcd(m,b)$](https://dxdy-02.korotkov.co.uk/f/9/5/0/950573acef5c8f9fb2867f559f8d17c682.png)
вычисляются по следующим формулам:
![$$\Psi'_y(m)=\Psi_y(m)+(y_b-y_a)(\gcd(m,a)-\gcd(m,b))$$ $$\Psi'_y(m)=\Psi_y(m)+(y_b-y_a)(\gcd(m,a)-\gcd(m,b))$$](https://dxdy-03.korotkov.co.uk/f/2/b/c/2bc36b0abf9d03019347cd303f07c13882.png)
Сложность расчета
![$\Delta D$ $\Delta D$](https://dxdy-04.korotkov.co.uk/f/b/8/a/b8aef87d1daec1035b0511383792779782.png)
есть
![$O(1)$ $O(1)$](https://dxdy-02.korotkov.co.uk/f/1/e/2/1e2f931ee6c0b8e7a51a7b0d123d514f82.png)
, а сложность обновления всех
![$\Psi_x,\Psi_y$ $\Psi_x,\Psi_y$](https://dxdy-02.korotkov.co.uk/f/9/2/4/9246b836390700e09aea60e2ac44ace182.png)
есть
![$O(n^2).$ $O(n^2).$](https://dxdy-02.korotkov.co.uk/f/d/4/8/d4819412bd5f1f6ec683d2362a50e02882.png)
Ускорение получается за счёт того, что
![$\Delta D$ $\Delta D$](https://dxdy-04.korotkov.co.uk/f/b/8/a/b8aef87d1daec1035b0511383792779782.png)
вычисляется значительно чаще чем выполняется обмен
![$a\leftrightarrow b.$ $a\leftrightarrow b.$](https://dxdy-04.korotkov.co.uk/f/f/b/7/fb7a4711c1ff238fc98e423ca93f722782.png)
Но можно
![$\Psi_x,\Psi_y$ $\Psi_x,\Psi_y$](https://dxdy-02.korotkov.co.uk/f/9/2/4/9246b836390700e09aea60e2ac44ace182.png)
не хранить, а вычислять в процессе вычисления
![$\Delta D.$ $\Delta D.$](https://dxdy-01.korotkov.co.uk/f/8/c/6/8c61d85677d90030510e9eca8ead3abe82.png)
При этом хранить
![$X_k,Y_k$ $X_k,Y_k$](https://dxdy-04.korotkov.co.uk/f/b/f/a/bfa253625808c3e109488426d8fc7e0582.png)
и обновлять их при фактическом выполнении обмена
![$a\leftrightarrow b.$ $a\leftrightarrow b.$](https://dxdy-04.korotkov.co.uk/f/f/b/7/fb7a4711c1ff238fc98e423ca93f722782.png)
В этом случае сложность вычисления
![$\Delta D$ $\Delta D$](https://dxdy-04.korotkov.co.uk/f/b/8/a/b8aef87d1daec1035b0511383792779782.png)
и сложность пересчёта
![$X_k,Y_k$ $X_k,Y_k$](https://dxdy-04.korotkov.co.uk/f/b/f/a/bfa253625808c3e109488426d8fc7e0582.png)
будет пропорциональна числу делителей
![$a$ $a$](https://dxdy-01.korotkov.co.uk/f/4/4/b/44bc9d542a92714cac84e01cbbb7fd6182.png)
и
![$b,$ $b,$](https://dxdy-02.korotkov.co.uk/f/d/a/c/dac8e4c431e5df0d84bdff4a79b0d22482.png)
то есть в среднем
![$O(\log n).$ $O(\log n).$](https://dxdy-01.korotkov.co.uk/f/4/5/4/454d1c803d65fe5a998cad547eb1b55082.png)
UPD: Исправлены формулы.