atcoder#AGC019E. [AGC019E] Shuffle and Swap

[AGC019E] Shuffle and Swap

配点 : 17001700

問題文

0011 からなる同じ長さの二つの文字列 A=A1A2...AnA = A_1 A_2 ... A_nB=B1B2...BnB = B_1 B_2 ... B_n があります。 A,BA, B に含まれる 11 の個数は等しいです。

あなたは次のアルゴリズムによって AA を変化させることにしました。

  • a1a_1, a2a_2, ..., aka_k を、AA11 が出現する位置の添字とする。
  • b1b_1, b2b_2, ..., bkb_k を、BB11 が出現する位置の添字とする。
  • a,ba, b の要素をそれぞれ無作為に並び替える。これらの無作為な並び替えは一様かつ独立である。
  • 11 から kk までの各 ii に対して、順に AaiA_{a_i}AbiA_{b_i} の値を入れ替える。

この手順のあと、文字列 A,BA, B が一致する確率を PP とします。

さらに、Z=P×(k!)2Z = P \times (k!)^2 とします。明らかに、ZZ は整数です。

ZZ998244353998244353 で割った余りを求めてください。

制約

  • 1A=B10,0001 \leq |A| = |B| \leq 10,000
  • A,BA, B0011 からなる。
  • A,BA, B に含まれる 11 の個数は等しい。
  • A,BA, B には 11 が少なくとも一つ含まれる。

部分点

  • 1A=B5001 \leq |A| = |B| \leq 500 を満たすデータセットに正解すると、12001200 点が与えられる。

入力

入力は以下の形式で標準入力から与えられる。

AA

BB

出力

ZZ998244353998244353 で割った余りを出力せよ。

1010
1100
3

最初の二つのステップで、a=[1,3]a = [1, 3], b=[1,2]b = [1, 2] となります。a,ba, b の要素を無作為に並び替えたあとの結果としてありうるものは次の 44 つです。

  • a=[1,3]a = [1, 3], b=[1,2]b = [1, 2]。はじめ A=1010A = 1010A1A_1A1A_1 の入れ替え後 A=1010A = 1010A3A_3A2A_2 の入れ替え後 A=1100A = 1100
  • a=[1,3]a = [1, 3], b=[2,1]b = [2, 1]。はじめ A=1010A = 1010A1A_1A2A_2 の入れ替え後 A=0110A = 0110A3A_3A1A_1 の入れ替え後 A=1100A = 1100
  • a=[3,1]a = [3, 1], b=[1,2]b = [1, 2]。はじめ A=1010A = 1010A3A_3A1A_1 の入れ替え後 A=1010A = 1010A1A_1A2A_2 の入れ替え後 A=0110A = 0110
  • a=[3,1]a = [3, 1], b=[2,1]b = [2, 1]。はじめ A=1010A = 1010A3A_3A2A_2 の入れ替え後 A=1100A = 1100A1A_1A1A_1 の入れ替え後 A=1100A = 1100

この 44 つの結果のうち、33 つで A=BA = B となっています。よって、P=3P = 3 / 44 であり、Z=3Z = 3 となります。

01001
01001
4

AA の要素の入れ替えによって AA が変化することはなく、したがって必ず A=BA = B となります。

101010
010101
36

三回の AA の要素の入れ替えがどのように起こっても、AA に含まれる 11 は適切な位置に移動します。

1101011011110
0111101011101
932171449