Problem:
Score : 400 points

Problem Statement

Given is a string S. Each character in S is either a digit (0, ..., 9) or ?.

Among the integers obtained by replacing each occurrence of ? with a digit, how many have a remainder of 5 when divided by 13? An integer may begin with 0.

Since the answer can be enormous, print the count modulo 10^9+7.

Constraints

S is a string consisting of digits (0, ..., 9) and ?.

1 \leq |S| \leq 10^5

Input

Input is given from Standard Input in the following format:

S

Output

Print the number of integers satisfying the condition, modulo 10^9+7.

Sample Input 1

??2??5

Sample Output 1

768

For example, 482305, 002865, and 972665 satisfy the condition.

Sample Input 2

?44

Sample Output 2

1

Only 044 satisfies the condition.

Sample Input 3

7?4

Sample Output 3

0

We may not be able to produce an integer satisfying the condition.

Sample Input 4

?6?42???8??2??06243????9??3???7258??5??7???????774????4?1??17???9?5?70???76???

Sample Output 4

153716888

Solution in C# (.NET Core 3.1.201) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AtCoder.Abc135
{
    class D_FPS
    {
        private static readonly long mod = 1000000007;

        public static void Main()
        {
            var s = Console.ReadLine();
            var n = s.Length;

            var d = 1;
            var r = 0;

            var fCount = new int[6];

            for (int i = 0; i < s.Length; i++)
            {
                if (s[n - 1 - i] == '?')
                    fCount[i % 6]++;
                else
                {
                    int num = s[n - 1 - i] - '0';
                    r = (r + num * d) % 13;
                }
                d = d * 10 % 13;
            }

            var g = new long[13];
            g[0] = 1;
            d = 1;
            for (int i = 0; i < 6; i++)
            {
                var f = new long[13];
                for (int j = 0; j <= 9; j++)
                    f[j * d % 13]++;
                d = d * 10 % 13;
                f = Power(f, fCount[i]);
                g = Mul(g, f);
            }
            Console.WriteLine(g[(5 + 13 - r) % 13]);
        }

        private static long[] Power(long[] f, int n)
        {
            var g = new long[f.Length];
            g[0] = 1;
            while (n > 0)
            {
                if (n % 2 == 1)
                    g = Mul(f, g);
                f = Mul(f, f);
                n /= 2;
            }
            return g;
        }

        private static long[] Mul(long[] f, long[] g)
        {
            var ret = new long[f.Length];
            for (int i = 0; i < f.Length; i++)
            {
                for (int j = 0; j < f.Length; j++)
                {
                    var k = (i + j) % f.Length;
                    ret[k] = (ret[k] + f[i] % mod * g[j]) % mod;
                }
            }
            return ret;
        }
    }
}