Autumn Fest 2012 J
   Ninja of Train
       writer: uwi
     tester: komiya



                      1
問題概要

[0,H-1]の窓に対して時間[√D]だけかけてD移動
する動作を繰り返したとき時刻Tまでの動作の総数
を求めよ(語弊あり)。




                          2
注意点

● Hより長く飛べる場合があります!
 ○ サンプル3は
   ■ 0
   ■ 0→1,0→2,0→3
   ■ 0→1→2,0→1→3,0→1→4
   ■ 0→2→3,0→2→4
   ■ 0→3→4
   ■ 0→4(時間2かけて移動)
   の11通り。




                         3
考え方

忍者が飛んでいる間は、目標地点の真上で降下し
ていると考える。

                    t=1



 t=0
                    t=2
                          x
       0        4
                              4
考え方

車窓の系から見て、Dジャンプすると、移動距離は
D-[√D], 降下の最大の高さは[√D]-1になる。
D-[√D]<Hを満たすDについて考えれば良い。
                           t=1



 t=0
                           t=2
                                 x
       0            4-√4
                                     5
考え方

最大のDをPとおくと、状態数はH*[√P]. この中で
DPなり行列べき乗なり。

1. DP解法 (O((H[√P])^2*T))
2. 行列べき乗 (O((H[√P])^3*log T))
3. ??????? (O(H^3*[√P]^2*log T))




                                   6
3. 行列べき乗高速化

[√P]*[√P]ごとのブロックにわけると、各ブロックは
下三角Toeplitz行列になっている。
http://en.wikipedia.org/wiki/Toeplitz_matrix




(                                         )
    1                 1

    1    1                   1

         1      1                   1




    1


                                               7
3. 行列べき乗高速化

下三角Toeplitz行列同士の乗算はO(N^2)で行えるの
で、これを利用して高速化できる。
http://www.codeforces.com/problemset/problem/223/C (類題)




                                                      8
注意点

● %modが多くなってTLEする場合がある。
 ○ 各自工夫を。modを小さくしているのはこれのためです。
● 数え上げ項の扱い
 ○ ブロックのサイズは全て同じでしかも下三角Toeplitzじゃ
   ないといけないので、数え上げ用のブロックを単位行列
   のような形にしておく。




                                    9
余談

● 最初は忍者が止まったままのものも考えたかっ
  たが、Toeplitzにならずゲロムズになってしまっ
  た。
● rngさんまじぱねぇ
 ○ ACした2人は0~H-1の中で進む組合せが限定的なこと
   を利用してDP+Combinationで解いていました。




                                  10

Ninja of Train