仔细想一想,对于从
i
i
i 走
2
k
(
k
∈
N
且
k
≤
64
)
2^k(k\in N且k\le 64)
2k(k∈N且k≤64) 到
j
j
j ,对答案的贡献为1,等效于此时
i
i
i 与
j
j
j 间有一条边。那我们就可以用基于floyd思想的倍增表去维护这种边。
具体的,设
m
p
k
,
i
,
j
,
i
n
d
mp_{k,i,j,ind}
mpk,i,j,ind 表示只有前
k
k
k 个点时,
i
i
i 到
j
j
j 之间走
2
i
n
d
2^{ind}
2ind 是否能到达。类比floyd,有转移(floyd)
m
p
k
,
i
,
j
,
i
n
d
=
m
p
k
−
1
,
i
,
j
,
i
n
d
∥
(
m
p
k
−
1
,
i
,
k
,
i
n
d
−
1
&
m
p
k
−
1
,
k
,
j
,
i
n
d
−
1
)
mp_{k,i,j,ind} =mp_{k-1,i,j,ind} \| (mp_{k-1,i,k,ind-1}\& mp_{k-1,k,j,ind-1})
mpk,i,j,ind=mpk−1,i,j,ind∥(mpk−1,i,k,ind−1&mpk−1,k,j,ind−1)
类比floyd,其中
k
k
k 这一维可以滚动掉,而
i
n
d
ind
ind 作为阶段放在最外层,从而维护出一个倍增表,可以维护可达性。