Buggy python submission (verdict: Time Limit Exceeded):
# 解説を参考に作成
# #6716052を参考


def solve():
    S = [-1 if i == '?' else int(i) for i in input()[::-1]]
    dp = [0] * 13
    mod = 10 ** 9 + 7

    if S[0] == -1:
        dp = [1 if i < 10 else 0 for i in range(13)]
    else:
        dp[int(S[0])] = 1
    for i, s in enumerate(S[1:], 1):
        digit = pow(10, i, 13)
        next_dp = [0] * 13
        if s == -1:
            next_dp = [sum([dp[(13 - (digit * j) + nn) % 13] for j in range(10)]) for nn in range(13)]
        else:
            x = (digit * s) % 13
            next_dp = [dp[(13 - x + nn) % 13] for nn in range(13)]
        dp = [ndp % mod for ndp in next_dp]
    print(dp[5])


if __name__ == '__main__':
    solve()


Fixed submission:
# 解説を参考に作成
# #11254823を参考


def solve():
    S = input()
    mod = 10 ** 9 + 7

    '''
    桁数毎・余りの数字ごとのdpを作成するにあたり、mapを作る.
    たとえば新しい数字Yは前の数字Xの右側に新たに桁を作って
        Y = X(前の数字) * 10 + i(0 <= i <= 9)
    と表せる.
    この Y の余りは、
        Y % 13 = ((X % 13) * 10 + i) % 13
    と表せるので、10 * 13 のマップであらかじめ計算しておくことができる.
    このマップを以下で作っている.
        modmap[新しい桁の数字i][新しい余り(Y % 13 = k)] = 前の数字の時の余り(X % 13 = j)
    '''
    modmap = []
    for i in range(10):
        modmap.append([0] * 13)
        for j in range(13):
            k = (j * 10 + i) % 13
            modmap[i][k] = j

    # なぜ最初を1にするのか？
    # → Sの先頭に 0 を固定でつけても結果は変化しない. また付けた場合の最初の計算では余り0となる.
    # → どんなパターンでも共通の初期状態として使用できる.
    dp = [1] + [0] * 12
    for s in S:
        if s == '?':
            dp = [sum(dp[l] for l in modlist) % mod for modlist in zip(*modmap)]
        else:
            modlist = modmap[int(s)]
            dp = [dp[modlist[l]] % mod for l in range(13)]

    print(dp[5])


if __name__ == '__main__':
    solve()

Buggy python submission (verdict: Time Limit Exceeded):
# 解説を参考に作成
# #6716052を参考


def solve():
    S = [-1 if i == '?' else int(i) for i in input()[::-1]]
    dp = [0] * 13
    mod = 10 ** 9 + 7

    if S[0] == -1:
        dp = [1 if i < 10 else 0 for i in range(13)]
    else:
        dp[int(S[0])] = 1
    # print(S)
    for i, s in enumerate(S[1:], 1):
        # print(dp)
        digit = pow(10, i, 13)
        next_dp = [0] * 13
        if s == -1:
            for j in range(10):
                x = (digit * j) % 13
                for k in range(13):
                    next_dp[(x + k) % 13] += dp[k]
            pass
        else:
            x = (digit * s) % 13
            for k in range(13):
                next_dp[(x + k) % 13] += dp[k]
        dp = [ndp % mod for ndp in next_dp]
    # print(dp)
    print(dp[5])


if __name__ == '__main__':
    solve()


Fixed submission:
# 解説を参考に作成
# #11254823を参考


def solve():
    S = input()
    mod = 10 ** 9 + 7

    '''
    桁数毎・余りの数字ごとのdpを作成するにあたり、mapを作る.
    たとえば新しい数字Yは前の数字Xの右側に新たに桁を作って
        Y = X(前の数字) * 10 + i(0 <= i <= 9)
    と表せる.
    この Y の余りは、
        Y % 13 = ((X % 13) * 10 + i) % 13
    と表せるので、10 * 13 のマップであらかじめ計算しておくことができる.
    このマップを以下で作っている.
        modmap[新しい桁の数字i][新しい余り(Y % 13 = k)] = 前の数字の時の余り(X % 13 = j)
    '''
    modmap = []
    for i in range(10):
        modmap.append([0] * 13)
        for j in range(13):
            k = (j * 10 + i) % 13
            modmap[i][k] = j

    # なぜ最初を1にするのか？
    # → Sの先頭に 0 を固定でつけても結果は変化しない. また付けた場合の最初の計算では余り0となる.
    # → どんなパターンでも共通の初期状態として使用できる.
    dp = [1] + [0] * 12
    for s in S:
        if s == '?':
            dp = [sum(dp[l] for l in modlist) % mod for modlist in zip(*modmap)]
        else:
            modlist = modmap[int(s)]
            dp = [dp[modlist[l]] % mod for l in range(13)]

    print(dp[5])


if __name__ == '__main__':
    solve()

Buggy python submission (verdict: Time Limit Exceeded):
# 解説を参考に作成

def solve():
    S = input()
    dp = [[0 for _ in range(13)] for _ in range(len(S))]
    mod = 10 ** 9 + 7

    if S[-1] == '?':
        dp[0] = [1 if i < 10 else 0 for i in range(13)]
    else:
        dp[0][int(S[-1])] = 1

    for i, s in enumerate(S[::-1][1:], 1):
        digit = pow(10, i, 13)
        if s == '?':
            for j in range(10):
                x = (j * digit) % 13
                for k in range(13):
                    # print(s, i, j, k, x)
                    dp[i][(x + k) % 13] += dp[i - 1][k] % mod
                    # dp[i][(x + k) % 13] += pow(dp[i - 1][k], 1, mod)
        else:
            x = (int(s) * digit) % 13
            for k in range(13):
                # print(s, i, 'X', k, x)
                dp[i][(x + k) % 13] += dp[i - 1][k] % mod
                # dp[i][(x + k) % 13] += pow(dp[i - 1][k], 1, mod)
    print(dp[-1][5] % mod)


if __name__ == '__main__':
    solve()


Fixed submission:
# 解説を参考に作成
# #11254823を参考


def solve():
    S = input()
    mod = 10 ** 9 + 7

    '''
    桁数毎・余りの数字ごとのdpを作成するにあたり、mapを作る.
    たとえば新しい数字Yは前の数字Xの右側に新たに桁を作って
        Y = X(前の数字) * 10 + i(0 <= i <= 9)
    と表せる.
    この Y の余りは、
        Y % 13 = ((X % 13) * 10 + i) % 13
    と表せるので、10 * 13 のマップであらかじめ計算しておくことができる.
    このマップを以下で作っている.
        modmap[新しい桁の数字i][新しい余り(Y % 13 = k)] = 前の数字の時の余り(X % 13 = j)
    '''
    modmap = []
    for i in range(10):
        modmap.append([0] * 13)
        for j in range(13):
            k = (j * 10 + i) % 13
            modmap[i][k] = j

    # なぜ最初を1にするのか？
    # → Sの先頭に 0 を固定でつけても結果は変化しない. また付けた場合の最初の計算では余り0となる.
    # → どんなパターンでも共通の初期状態として使用できる.
    dp = [1] + [0] * 12
    for s in S:
        if s == '?':
            dp = [sum(dp[l] for l in modlist) % mod for modlist in zip(*modmap)]
        else:
            modlist = modmap[int(s)]
            dp = [dp[modlist[l]] % mod for l in range(13)]

    print(dp[5])


if __name__ == '__main__':
    solve()

Buggy python submission (verdict: Time Limit Exceeded):
# 解説を参考に作成

def solve():
    S = input()
    dp = [[0 for _ in range(13)] for _ in range(len(S))]

    if S[-1] == '?':
        dp[0] = [1 if i < 10 else 0 for i in range(13)]
    else:
        dp[0][int(S[-1])] = 1

    for i, s in enumerate(S[::-1][1:], 1):
        digit = pow(10, i, 13)
        if s == '?':
            for j in range(10):
                x = (j * digit) % 13
                for k in range(13):
                    # print(s, i, j, k, x)
                    dp[i][(x + k) % 13] += dp[i - 1][k] % (10 ** 9 + 7)
        else:
            x = (int(s) * digit) % 13
            for k in range(13):
                # print(s, i, 'X', k, x)
                dp[i][(x + k) % 13] += dp[i - 1][k] % (10 ** 9 + 7)
    print(dp[-1][5] % (10 ** 9 + 7))


if __name__ == '__main__':
    solve()


Fixed submission:
# 解説を参考に作成
# #11254823を参考


def solve():
    S = input()
    mod = 10 ** 9 + 7

    '''
    桁数毎・余りの数字ごとのdpを作成するにあたり、mapを作る.
    たとえば新しい数字Yは前の数字Xの右側に新たに桁を作って
        Y = X(前の数字) * 10 + i(0 <= i <= 9)
    と表せる.
    この Y の余りは、
        Y % 13 = ((X % 13) * 10 + i) % 13
    と表せるので、10 * 13 のマップであらかじめ計算しておくことができる.
    このマップを以下で作っている.
        modmap[新しい桁の数字i][新しい余り(Y % 13 = k)] = 前の数字の時の余り(X % 13 = j)
    '''
    modmap = []
    for i in range(10):
        modmap.append([0] * 13)
        for j in range(13):
            k = (j * 10 + i) % 13
            modmap[i][k] = j

    # なぜ最初を1にするのか？
    # → Sの先頭に 0 を固定でつけても結果は変化しない. また付けた場合の最初の計算では余り0となる.
    # → どんなパターンでも共通の初期状態として使用できる.
    dp = [1] + [0] * 12
    for s in S:
        if s == '?':
            dp = [sum(dp[l] for l in modlist) % mod for modlist in zip(*modmap)]
        else:
            modlist = modmap[int(s)]
            dp = [dp[modlist[l]] % mod for l in range(13)]

    print(dp[5])


if __name__ == '__main__':
    solve()

Buggy python submission (verdict: Runtime Error):
import math


def solve():
    S = input()
    q_count = S.count('?')
    ans = math.ceil(10 ** q_count / 13)
    if int(S.replace('?', '0')) % 13 != 0:
        ans -= 1
    if int(S.replace('?', '9')) % 13 != 0:
        ans -= 1
    if ans < 0:
        print(0)
    else:
        print(ans % (10 ** 9 + 7))


if __name__ == '__main__':
    solve()


Fixed submission:
# 解説を参考に作成
# #11254823を参考


def solve():
    S = input()
    mod = 10 ** 9 + 7

    '''
    桁数毎・余りの数字ごとのdpを作成するにあたり、mapを作る.
    たとえば新しい数字Yは前の数字Xの右側に新たに桁を作って
        Y = X(前の数字) * 10 + i(0 <= i <= 9)
    と表せる.
    この Y の余りは、
        Y % 13 = ((X % 13) * 10 + i) % 13
    と表せるので、10 * 13 のマップであらかじめ計算しておくことができる.
    このマップを以下で作っている.
        modmap[新しい桁の数字i][新しい余り(Y % 13 = k)] = 前の数字の時の余り(X % 13 = j)
    '''
    modmap = []
    for i in range(10):
        modmap.append([0] * 13)
        for j in range(13):
            k = (j * 10 + i) % 13
            modmap[i][k] = j

    # なぜ最初を1にするのか？
    # → Sの先頭に 0 を固定でつけても結果は変化しない. また付けた場合の最初の計算では余り0となる.
    # → どんなパターンでも共通の初期状態として使用できる.
    dp = [1] + [0] * 12
    for s in S:
        if s == '?':
            dp = [sum(dp[l] for l in modlist) % mod for modlist in zip(*modmap)]
        else:
            modlist = modmap[int(s)]
            dp = [dp[modlist[l]] % mod for l in range(13)]

    print(dp[5])


if __name__ == '__main__':
    solve()