LOJ 6781 Tutorial

題目:6781矩陣歸零

大意:

有一個

n×m
01
矩陣一開始都是
0
,一次操作會將第
x
列和第
y
行取反,先進行給定的
k
次操作打亂矩陣,再隨機操作直到復原,求模
998244353
意義下的期望操作次數。

Subtask 1 (15%)

整個矩陣可以用每一個行列被取反的次數來描述,用

0
1
表示這個行或列被取反了偶和奇數次,每次操作會將第
x
個列狀態和第
y
個行狀態取反,直到
n+m
個狀態全部為
0
1

fi,j 為當列狀態有
i
1
,行狀態有
j
1
時的期望操作次數,則
fi,j={0if(i,j)=(0,0) or (n,m)ijnmfi1,j1+i(mj)nmfi1,j+1+(ni)jnmfi+1,j1+(ni)(mj)nmfi+1,j+1+1else

因為每次操作不會改變所有
1
的個數的奇偶性,所以只有
i+j
為偶數的狀態是有用的,對這些狀態高斯消元求解後回答打亂後的狀態
fs,t
,時間複雜度
O((nm)3)

Subtask 2 (15%)

注意到這是一個網格圖上的稀疏方程組,可以用Berlekamp-Massey算法或網格圖消元來優化到

O((nm)2)

Subtask 3 (20%)

現在變量和方程式都有

O(nm) 個,如果能縮小到
O(n+m)
個,一般的高斯消元就可以有不錯的複雜度,將所有狀態
fi,j
ij
分類,每一組的第一個狀態當成變量,就是所有左上方的
fi,j
,然後由
fi+1,j+1=fi,jijfi1,j1i(mj)fi1,j+1(ni)jfi+1,j11(ni)(mj)
就可以得到
fi+1,j+1
關於已知項的線性表達,每一組的最後一項再與它附近的項構成一個方程式,對這些方程式做高斯消元,複雜度
O((n+m)3)

Subtask 4 (20%)

接下來的作法就和高斯消元沒什麼關係了,將行列分開來討論,先討論列,在每次操作中每個列都有

1n 的機率被選到,所以一個列在
i
次操作中被選中
i
次的機率的EGF(Exponential Generating Function)為
i01nixii!=e1nx
如果這個列需要被操作偶數次,其EGF為:
i01nixii![i is even]=e1nx+e1nx2
如果這個列需要被操作奇數次,其EGF為:
i01nixii![i is odd]=e1nxe1nx2
若打亂後列狀態有
s
1
,行狀態有
t
1
,表示有
s
個列需要被操作奇數次,
ns
個列需要被操作偶數次,那麼
i
次操作後列狀態全部為
0
的機率的EGF記為
EGF(A)=(e1nx+e1nx2)ns(e1nxe1nx2)s=ninaieinx

其中
A
是一個序列,
ai
為展開後
einx
項的係數,同理有
EGF(B)=(e1mx+e1mx2)mt(e1mxe1mx2)t=mimbieimx
表示行狀態全為
0
的EGF。

先討論比較簡單情況,當

n+m 為奇數時,不可能達成所有行列狀態同時為
1
,想要歸零矩陣只能全部為
0
,現在需要求出第
i
次操作使所有行列狀態全為
0
的OGF(Ordinary Generating Functions),記為
OGF(E)
,前面
A,B
都是EGF的形式,先把它們轉成OGF才能把對應操作次數的機率相乘,容易得到
OGF(A)=ninai1inx
OGF(B)=mimbi1imx
然後由
E
的定義有
[xk]OGF(E)=[xk]OGF(A)×[xk]OGF(B)
=(ninaiiknk)(mjmbjjkmk)=ninmjmaibj(ijnm)k
所以
OGF(E)=ninmjmaibj1ijnmx
但這還不是我們要的生成函數,
E
描述了第
i
次操作時歸零的機率,但不保證是第一次歸零,我們要的是恰好在第
i
次歸零的機率,如果一組操作在第
j
次第一次歸零,那麼剩下的
ij
次操作必須使每個行列都被操作偶數次,令
F(x)
為第
i
次操作時第一次歸零的機率的OGF,
G(x)
i
次操作使所有行列被取反偶數次的機率的OGF,則
E(x),F(x),G(x)

G(x)=ninmjmgrigcj1ijnmx
[xk]E(x)=i+j=k[xi]F(x)[xj]G(x)E(x)=F(x)×G(x)
其中
gr,gc
a,b
類似,是
(e1nx+e1nx2)n
(e1mx+e1mx2)m
展開後的係數。
注意到
F(x)=i0(fixi)=i0ifixi1
所以
F(1)
就是我們要的期望次數
F(1)=(E(1)G(1))=E(1)G(1)E(1)G(1)G2(1)
但是
E(x),G(x)
x=1
處是不收斂的,因為當
i=n,j=m
i=n,j=m
時分母是
1x
,我們知道答案一定收斂,所以將
F(x),G(x)
都乘上
1x
,然後計算
E(1),G(1),E(1),G(1)
這四項得到
E(1)=anbm+anbm
G(1)=grngcm+grngcm
因為
E(x)=ninmjm(aibj(1x)1ijnmx)=nin,mjmnm<i+j<n+maibj(1ijnmx)+aibjijnm(1x)(1ijnmx)2
所以
E(1)=nin,mjmnm<i+j<n+maibj1ijnm
G(1)=nin,mjmnm<i+j<n+mgrigcj1ijnm
現在來討論怎麼求
a,b,gr,gc
,在
(e1nx+e1nx2)ns
的展開中選擇
i
e1nx
(e1nxe1nx2)s
的展開中選
j
e1nx
會得到
e(ns2i+s2j)1nx=e(n2(i+j))1nx
項,發現只有與
n
同奇偶的項是有用的,其他都是
0
,重新定義
ak
e(n2k)1nx
的係數,那麼就有
ak=12ni+j=k(nsi)(sj)(1)jbk=12mi+j=k(mti)(tj)(1)j
grk=12n(nk)gck=12m(mk)
這部分可以直接
O(n2+m2)
計算,改寫並帶入上面四項
E(1)=a0b0+anbm=12n+m+12n+m=22n+m
anbm
為正是因為
s+t
一定是偶數
G(1)=gr0gc0+grngcm=12n+m+12n+m=22n+m
E(1)=0in,0jm0<i+j<n+maibj1(n2i)(m2j)nm=0in,0jm0<i+j<n+maibjnm(n2i)(m2j)nm
G(1)=0in,0jm0<i+j<n+mgrigcjnm(n2i)(m2j)nm
F(1)=E(1)G(1)E(1)G(1)G(1)2=nm20in,0jm0<i+j<n+maibjgrigcj(n2i)(m2j)nm
這樣就可以
O(nm)
算出
F(1)

別忘了這只是

n+m 為奇數時的狀況,若
n+m
為偶數,讓所有行列狀態變成
1
也可以歸零,
E
的定義變成操作
i
次使所有狀態都為
0
或都為
1
的機率,
G
為操作
i
次使所有行列狀態都取反偶數或都取反奇數次的機率,那麼有
E(x)=0in0jmaibj+cidj1(n2i)(m2j)nmxG(x)=0in0jmgrigcj+hrihcj1(n2i)(m2j)nmx

其中
c
EGF(C)
的係數,與
A
類似,代表從打亂後開始操作
i
次後所有列狀態都為
1
的機率,
hr
gr
類似,表示操作
i
次後所有列都被取反奇數次的EGF的係數,
d,hc
同理,一樣有
E(x)=F(x)×G(x)F(1)=nm40in,0jm0<i+j<n+maibj+cidjgrigcjhrihcj(n2i)(m2j)nm
同樣可以
O(nm)
計算。

Subtask 5 (30%)

還可以繼續優化,顯然

ak
(nsi)
(sj)(1)j
的捲積,
a,b,c,d
等係數都可以用
FFT
優化到
O(nlogn)
aibj(n2i)(m2j)nm
的部分可以看成
n
i
的有理函數
0in0jmaibj(n2i)(m2j)nm=0inai0jmbj(4j2m)i2nj

0jmbj(4j2m)i2nj=P(i)Q(i)
,那麼答案就是
0knakP(k)Q(k)
,可以用
FFT
分治求出
P(i),Q(i)
,如果已知
0jmidbj(4j2m)i2nj=Pl(i)Ql(i),mid+1jmbj(4j2m)i2nj=Pr(i)Qr(i)
就可以得到
P(i)=Pl(i)Qr(i)+Ql(i)Pr(i)Q(i)=Ql(i)Qr(i)
這部分的複雜度是
O(mlog2m)
,然後再用多項式多點求值求出
P(0)P(n)
Q(0)Q(n)
複雜度也是
O(nlog2n)
,所以總體複雜度就是
O(nlog2n+mlog2m)