Q - Kurukuru Editorial
by
hint908
\(t=1\) の操作を操作 \((x, a, y, b)\) 、\(t=2\) を転置操作、\((i, j)\) 要素が \((ix_{ii}+jy_{ji}+a_{i}, ~ix_{ij}+jy_{jj}+b_{j})\) に移動した状態を 状態 \((x_{ii}, y_{ji}, a_{i}, ~x_{ij}, y_{jj}, b_{j})\) と呼ぶことにします。
状態 \((x_{ii}, y_{ji}, a_{i}, ~x_{ij}, y_{jj}, b_{j})\) で操作 \((x_1, y_1, a_1, b_1)\) が行われると、状態 \((x_{ii}x_1, y_{ji}x_1, a_{i}x_1+a_1, ~ x_{ij}y_1, y_{jj}y_1, b_{j}y_1+b_1)\) にある状態になり、転置操作が行われると状態 \((x_{ij}, y_{jj}, b_{j}, ~x_{ii}, y_{ji}, a_{i})\) になります。
これはセグメントツリーに載せることができます。
クエリについて、差し引きを考えると \(c=e=0\) のときを求めることができればよいです。
さらに \(x_{ii} = y_{jj} = 0\) または \(x_{ij} = y_{ji} = 0\) が成り立つため、 \(x_{ii} = y_{jj} = 0\) の場合は転置操作を最後に行っておくことにします。
状態 \((x, 0, a, ~0, y, b)\) は \(~(i, j)\) 要素が \((ix+a, ~jy+b)\) に移動した状態を意味していたため、\(~0 \leq (ix+a \pmod N) \leq d~\) かつ \(~0 \leq (jy+b \pmod N) \leq f\) であるような \((i,j)\) について \(iN+j\) の総和を求める問題となります。
\(i\) と \(j\) は独立しているため、以降では \(0 \leq (ix+a~ (\bmod N)) \leq d\) であるような \(i\) の総和を考えます。(\(j\) についても同様に求めればよいです。)
\(i\) 行目が \(ix+a\) 行目に移動することは、\(\displaystyle \frac{i}{x} - \frac{a}{x}\) 行目が \(i\) 行目に移動することを意味しています。したがって \(\displaystyle \frac{1}{x} \equiv z~ (\bmod N)\) なる \(z\) に対し、 \(\displaystyle \sum_{i=0}^d (iz+az ~(\bmod N))\) を求めることになります。
\(\displaystyle \sum_{i=0}^d (ix+a ~(\bmod N)) = \sum_{i=0}^d (ix+a) - N\sum_{i=0}^d \mathrm{floor}\left(\frac{ix+a}{N}\right)\) であり、第二項については Sum of Floor of Linear と呼ばれる計算で \(O(\log N)\) で求まります。(ACL に floor_sum として実装済です)
\(\displaystyle \frac{1}{x} \equiv z~ (\bmod N)\) なる \(z\) について、本問題では \(x\)と \(N\) が互いに素であるため、\(N\) 以下の正整数で \(N\) と互いに素であるものの個数を \(\phi(N)\) として、\(z \equiv x^{\phi(N)-1}~(\bmod N)\) と表されます。
以上より \(O(M + Q(\log M + \log N))\) 時間で解けました。
解説では操作をセグメントツリーに載せましたが、逆操作を利用して累積和のように実装することもできます。こちらの場合、時間計算量は \(O(M + Q\log M)\) となります。
posted:
last update:
