が書いてあるマスからが書いてあるマスへのパスの求め方だけ検討すればよい。
2地点間のパスの総数自体は単純なDPで求まる。DPの遷移はの行列で書けるので、行列積をセグメント木などに乗せればで解ける。また、クエリが単調なことを利用するとSWAGが使えてになる。
満点を取るためにはもう少し頑張る必要がある。まず、遷移の行列が三重対角行列になっていることに注目すると、行列積はになる。したがって、SWAGへのpushとpopはこの計算量でできる……が、三重対角行列同士の積が三重対角行列になるわけではないので、SWAGをfoldする時の掛け算はどうしてもになってしまう。しかし、pathクエリに対して必要なのは行列そのものではなく一点の値なので、そこだけ求めるのはで可能だった。これでになった。
これでもなかなかACできなかった。行列をなるべく陽に持たずに省略できる部分は省略して、定数倍高速化を徹底するとようやく通った。