Submission #41261925


Source Code Expand

import sys
def input():
    return sys.stdin.readline().rstrip()
# EDPC R - Walk
N, K = map(int, input().split())
A = [list(map(int, input().split())) for i in range(N)]
# 隣接リスト
G = [[] for _ in range(N)]
for i in range(N):
    for j in range(N):
        if A[i][j]:
            G[i].append(j)
MOD = 10**9+7
# 長さK
# 単純有向グラフ
# ダブリング?
# 計算量は最大で2500*2500*60 3*10**8 間に合わない?
# dp[i][j][k]jから2**i回移動するとkにいる数
H = len(bin(K)[2:])
dp = [[[0]*N for i in range(N)] for _ in range(H)]
#初期化
for j in range(N):
    for v in G[j]:
        dp[0][j][v] += 1
for i in range(H-1):
    for j in range(N):
        for k in range(N):
            for l in range(N):
                # jからkに移動
                dp[i+1][j][k] = (dp[i+1][j][k]+dp[i][j][l]*dp[i][l][k])%MOD
#print(dp)
S = bin(K)[2:][::-1]
prev = [1]*N
for i in range(H):
    if S[i] == "0":continue
    cur = [0]*N
    for j in range(N):
        for k in range(N):
            cur[k] += prev[j]*dp[i][j][k]
            cur[k] %= MOD
    prev = cur
print(sum(prev)%MOD)

Submission Info

Submission Time
Task R - Walk
User te1229
Language PyPy3 (7.3.0)
Score 100
Code Size 1154 Byte
Status AC
Exec Time 185 ms
Memory 75596 KiB

Judge Result

Set Name All
Score / Max Score 100 / 100
Status
AC × 23
Set Name Test Cases
All 0_00, 0_01, 0_02, 0_03, 0_04, 1_00, 1_01, 1_02, 1_03, 1_04, 1_05, 1_06, 1_07, 1_08, 1_09, 1_10, 1_11, 1_12, 1_13, 1_14, 1_15, 1_16, 1_17
Case Name Status Exec Time Memory
0_00 AC 132 ms 61620 KiB
0_01 AC 48 ms 61576 KiB
0_02 AC 51 ms 61628 KiB
0_03 AC 52 ms 61400 KiB
0_04 AC 71 ms 71080 KiB
1_00 AC 49 ms 61540 KiB
1_01 AC 52 ms 61780 KiB
1_02 AC 60 ms 66268 KiB
1_03 AC 181 ms 75300 KiB
1_04 AC 58 ms 67452 KiB
1_05 AC 182 ms 75152 KiB
1_06 AC 59 ms 68372 KiB
1_07 AC 185 ms 75188 KiB
1_08 AC 185 ms 75084 KiB
1_09 AC 185 ms 75500 KiB
1_10 AC 176 ms 74924 KiB
1_11 AC 176 ms 75328 KiB
1_12 AC 163 ms 75272 KiB
1_13 AC 185 ms 75360 KiB
1_14 AC 175 ms 75180 KiB
1_15 AC 179 ms 74980 KiB
1_16 AC 184 ms 75596 KiB
1_17 AC 185 ms 75004 KiB