Problem:
Score : 100 points

Problem Statement

There is a simple directed graph G with N vertices, numbered 1, 2, \ldots, N.

For each i and j (1 \leq i, j \leq N), you are given an integer a_{i, j} that represents whether there is a directed edge from Vertex i to j.
If a_{i, j} = 1, there is a directed edge from Vertex i to j; if a_{i, j} = 0, there is not.

Find the number of different directed paths of length K in G, modulo 10^9 + 7.
We will also count a path that traverses the same edge multiple times.

Constraints

All values in input are integers.

1 \leq N \leq 50

1 \leq K \leq 10^{18}

a_{i, j} is 0 or 1.

a_{i, i} = 0

Input

Input is given from Standard Input in the following format:

N K
a_{1, 1} \ldots a_{1, N}
:
a_{N, 1} \ldots a_{N, N}

Output

Print the number of different directed paths of length K in G, modulo 10^9 + 7.

Sample Input 1

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

Sample Output 1

6

G is drawn in the figure below:

There are six directed paths of length 2:

1 → 2 → 3

1 → 2 → 4

2 → 3 → 4

2 → 4 → 1

3 → 4 → 1

4 → 1 → 2

Sample Input 2

3 3
0 1 0
1 0 1
0 0 0

Sample Output 2

3

G is drawn in the figure below:

There are three directed paths of length 3:

1 → 2 → 1 → 2

2 → 1 → 2 → 1

2 → 1 → 2 → 3

Sample Input 3

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

Sample Output 3

1

G is drawn in the figure below:

There is one directed path of length 2:

4 → 5 → 6

Sample Input 4

1 1
0

Sample Output 4

0

Sample Input 5

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

Sample Output 5

957538352

Be sure to print the count modulo 10^9 + 7.

Solution in C (GCC 5.4.1) (judge verdict: Accepted)

long mod=1e9+7,dp[50][50][99],a[50][50],b[50][50],k;
main(n)
{
	scanf("%d%ld",&n,&k);
	for(int i=0;i<n;i++)for(int j=0;j<n;j++)scanf("%d",dp[i][j]);
	for(int K=1;K<60;K++)
	{
		for(int i=0;i<n;i++)for(int j=0;j<n;j++)
		{
			for(int l=0;l<n;l++)dp[i][j][K]=(dp[i][j][K]+dp[i][l][K-1]*dp[l][j][K-1])%mod;
		}
	}
	for(int i=0;i<n;i++)a[i][i]=1;
	for(int K=0;K<60;K++)
	{
		if(k&1LL<<K)
		{
			for(int i=0;i<n;i++)for(int j=0;j<n;j++)
			{
				b[i][j]=0;
				for(int l=0;l<n;l++)b[i][j]=(b[i][j]+a[i][l]*dp[l][j][K])%mod;
			}
			for(int i=0;i<n;i++)for(int j=0;j<n;j++)a[i][j]=b[i][j];
		}
	}
	long ans=0;
	for(int i=0;i<n;i++)for(int j=0;j<n;j++)ans=(ans+a[i][j])%mod;
	printf("%d",ans);
}