#D0150. Walk

Walk

问题陈述

有一个简单的有向图 GG ,其顶点为 NN ,编号为 1,2,…,N1, 2, \ldots, N 。

对于每个 ii 和 jj ( 1≤i,j≤N1 \leq i, j \leq N ) 1≤i,j≤N1 \leq i, j \leq N ),你会得到一个整数 ai,ja_{i, j} ,表示顶点 ii 到 jj 之间是否有一条有向边。如果是 ai,j=1a_{i, j} = 1 ,则存在一条从顶点 ii 到 jj 的有向边,如果是 ai,j=0a_{i, j} = 0 ,则没有。

求 GG 中长度为 KK 的不同有向路径的数目,对 109+710^9 + 7 取模。我们还将计算多次穿越同一条边的路径。

限制因素

  • 所有输入值均为整数。
  • 1≤N≤501 \leq N \leq 50
  • 1≤K≤10181 \leq K \leq 10^{18}
  • ai,ja_{i, j} 是 00 或 11 。
  • ai,i=0a_{i, i} = 0

输入

输入内容由标准输入法提供,格式如下:

  • NN KK
  • a1,1a_{1, 1} …\ldots a1,Na_{1, N}
  • ::
  • aN,1a_{N, 1} …\ldots aN,Na_{N, N}

输出

打印 GG 中长度为 KK 的不同有向路径的数量,模数为 109+710^9 + 7 。

4 2
0 1 0 0
0 0 1 1
0 0 0 1
1 0 0 0
6

GG 如下图所示:

有六条长度为 22 的有向路径:

  • 11 → 22 → 33
  • 11 → 22 → 44
  • 22 → 33 → 44
  • 22 → 44 → 11
  • 33 → 44 → 11
  • 44 → 11 → 22
3 3
0 1 0
1 0 1
0 0 0
3

GG 如下图所示:

有三条长度为 33 的有向路径:

  • 11 → 22 → 11 → 22
  • 22 → 11 → 22 → 11
  • 22 → 11 → 22 → 33
6 2
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 0 0
0 0 0 0 1 0
0 0 0 0 0 1
0 0 0 0 0 0
1

GG 如下图所示:

有一条长度为 22 的有向路径:

  • 44 → 55 → 66
1 1
0
0
10 1000000000000000000
0 0 1 1 0 0 0 1 1 0
0 0 0 0 0 1 1 1 0 0
0 1 0 0 0 1 0 1 0 1
1 1 1 0 1 1 0 1 1 0
0 1 1 1 0 1 0 1 1 1
0 0 0 1 0 0 1 0 1 0
0 0 0 1 1 0 0 1 0 1
1 0 0 0 1 0 1 0 0 0
0 0 0 0 0 1 0 0 0 0
1 0 1 1 1 0 1 1 1 0
957538352

记得对 109+710^9 + 7 取余。

来源

https://atcoder.jp/contests/dp/tasks/dp_r