この解説では全体として0-indexedを用います。
操作で生成される 2N 個の乱数は順序のみが重要であり、また等しい値が生成される確率は 0 としてよいため、生成される乱数を (0,1,…,2N−1) の順列 (P0,P1,…,P2N−1) に言い換え、i 番目の操作では x=2πP2i,y=2πP2i+1 とするとしても問題は本質的に等しくなります。また、言い換えた後の問題について条件を満たす P の個数を 998244353 で割った余りがそのままこの問題で出力すべき値となります。
条件を次のように言い換え、包除原理を行います。
- 0≤i<2N を満たす各整数 i について、最終的な S に 4π2i+1 が含まれる。
2N 個の頂点からなり、i 番目の条件に (i,i+1) の辺が対応するようなグラフを考えます。(ただし、頂点番号は mod 2N で同一視します。)
ある条件を違反すると決め打った時、その条件に対応する辺が削除されます。
ここで、違反すると決め打った条件が一つでも存在する場合、このグラフのそれぞれの連結成分について、P に次のような条件が課されます。
- QPi=i となるような P の逆順列 Q を考える。また、その連結成分に含まれる頂点の集合を V とし、R={Qx∣x∈V} とする。この時、次の条件が成り立つ。
- x∈R ならば、(x⊕1)∈R。
- また、グラフの辺を i→i+1 の向きの有向辺と考えた時、次の条件が成り立つ。
- x∈R かつ x が偶数ならば、Qi=x となる頂点 i から Qj=(x⊕1) となる頂点 j へ到達できる。
違反すると決め打った条件が一つでも存在するような場合について、それぞれの連結成分の大きさを並べた数列 (S0,S1,…,SK−1) を考える動的計画法を行います。まず、あるグラフに対し S を考えた場合、答えへの寄与は次のように計算できます。
- S に奇数が含まれている場合、0
- そうでない場合、S の各要素を 2 で割った数列を T とした時、(−1)K×∏i=0K−1(2TiSi!)×∏i=0K−1(Ti!)N!
この式を動的計画法にすると、S の末尾に s=2t を追加する場合 −2tt!s! を係数としてかけていくとすることで計算することができます。
また、ある S に対応するグラフは複数個存在するため、最初または最後に追加する s を係数としてかけるなどの方法でその部分の計算もすることができます。
この動的計画法を行うことで、この問題を O(N2) で解くことができました。違反する条件を一つも選ばない場合も別で計算することに注意してください。
(なお、この動的計画法は多項式の逆元を用いることで O(NlogN) に高速化することができます。)