N - All Crosses Editorial by maspy


writer 解説と同様に、本問題は次に帰着できます。

\(M\times M\)行列 \(A\) が与えられる。\(Ax = 0\pmod{X}\) となるベクトル \(x\neq 0\) が存在するかを判定し、存在するならばひとつ構築せよ。

まず、\(\det(A)\)\(\pmod{X}\) で可逆ならば、解はありません(逆行列がとれるので)。そうでないならば、\(p\mid X\) かつ \(p\mid \det(A)\) となる素数 \(p\) がとれます。このとき \(Ax=0\pmod{p}\) となる非自明なベクトル \(x\) がとれて、それを \(X/p\) 倍すれば、解を構築できます。

したがって、\(X\) の素因数 \(p\) ごとに、次を行えばよいです。

  • \(p\mid \det(A)\) となる \(p\) が見つかったら、\(Ax = 0\pmod{p}\) の解を求めることで解を構築する。
  • そのような \(p\) が見つからなければ解は存在しない。

計算量は

  • \(A\pmod{X}\) の計算:\(O(M^2N)\)
  • \(p\) ごとの処理:\(O(M^3)\)

を合わせて \(O(M^2N+M^3\log X)\) です。

posted:
last update: