ARC223 B - Valid Arrays by K-Divisible Swaps

Kで割れる交換

考え方

数列を、以下のようにグループにわける。

入れ替えの条件について考える。
まず、異なるグループ間での交換は不可能、よってグループ分けが崩れることはない。
そして、同じグループ間で入れ替えた場合、これもグループ分けが崩れることはない。
したがって、各グループ内で独立に考えて差し支えない。
グループ内の並べ替え方を順に考え、全てかけ合わせれば答え。

まず、$k$ で割った余りが $0$ であるグループ、または $k/2$ であるグループ。
この場合、グループ内の任意の $2$ つが入れ替え可能で、つまり最終的に任意の順に並べられる。
つまり、見分けがつかないものを含む順列の公式 $\dfrac{n!}{p!q!r!\dots}$ で求まる。

まず、$k$ で割った余りが $i$ または $k-i$ であるグループ。
この場合、余りが $i$ であるものと $k-i$ であるものは、入れ替え可能。
しかし、$i$ であるもの同士や $k-i$ であるもの同士は、入れ替え不可能。
最終的には、$i$ であるものの順番は保持、 $k-i$ であるものの順番も保持した任意の順列にできる。
つまり、$i$ であるものの位置の選び方を選べばよく、二項係数として求まる。

前述のとおり、グループごとの値を全てかけあわせて $998244353$ で割った余りが答え。

入力例1での動作

$2$ つ目のテストケースのみ考える。

入力を受け取る。

n: 6
k: 4
a: {1, 5, 3, 6, 2, 4}

a を仮に全て $4$ で割った余りすると、以下のようになる。

a%4: {1, 1, 3, 2, 2, 0}

これを参考に a をグループに分ける。
$k=4$ なので、以下に分ける。

a': { {1,5,3}, {6,2}, {4} }

各部分の並べ替えのパターン数を求めていく。

まず、$\{1,5,3\}$ 部分。
$4$ で割った余りが異なるもの同士は入れ替えられるが、同じものは入れ替えられない。
よって余りが $1$ のもの $2$ つを何番目に置くかを考えればよく、${}_3\mathrm{C}_2 = 3$ 通り。

次に、$\{6,2\}$ 部分。
この範囲内を任意の順に並べられる。
よって見分けがつかないものを含む順列で考えて、$\dfrac{2!}{1!1!} = 2$ 通り。

最後に、$\{4\}$ 部分。
この範囲内を任意の順に並べられる。
よって見分けがつかないものを含む順列で考えて、$\dfrac{1!}{1!} = 1$ 通り。

これらをすべてかけて $3 \times 2 \times 1 = 6$ を $998244353$ で割った余りが答え。

注意点

答えは $998244353$ で割った余りを要求されているので、剰余類環の考えに従って処理する。
順列数や二項係数を何度も使うため、階乗と階乗の逆元を前計算しておく。

別解

特になし。