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 Java8 (OpenJDK 1.8.0) (judge verdict: Accepted)

import java.util.Arrays;
import java.util.Scanner;

public class Main 
{
	static long MOD = 1000000007;
	static long[][] dp;
	static int[] a;
	static int n;
	static int[] ss = {1, 10, 9, 12, 3, 4};
	
	static int seq(int pos)
	{
		int c = (n-1-pos)%6;
//		System.out.println("for pos " + pos + ", it's " + ss[c]);
		return ss[c];
	}
	
	
	public static void main(String[] args) 
	{
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		a = new int[s.length()];
		for(int i = 0; i < s.length(); i++)
		{
			if(s.charAt(i) == '?')a[i] = -1;
			else a[i] = s.charAt(i)-'0';
		}
		n = s.length();
		
		dp = new long[n][13];
		for(int pos = 0; pos < n; pos++)
		{
			
			for(int x = 0; x <= 9; x++)
			{
				if(a[pos] == x || a[pos] == -1)
				{ //possible. apply this.
					for(int prevmod = 0; prevmod < 13; prevmod++)
					{
						long prevsc;
						if(pos==0&&prevmod==0)prevsc=1;
						else if(pos==0)prevsc=0;
						else prevsc = dp[pos-1][prevmod];
						//no. of ways that up until the prev digits the mod is prevmod
						
						int resmod = ((x*seq(pos))+prevmod)%13;
						while(resmod<0)resmod+=13;
						
						if(pos==n-1 && prevsc>0 && resmod == 5)
						{
//							System.out.println("resmod is from: " + seq(pos));
//							System.out.println("pos: " + pos + " resmod " + resmod + " prevsc " + prevsc + ", prevmod " + prevmod);
						}
//						System.out.println("Test " + pos + ", " + x);
						dp[pos][resmod]=((dp[pos][resmod]+prevsc)%MOD);
					}
					
					
				}
			}
			
		}
		
		dp[n-1][5]=(dp[n-1][5])%MOD;
		while(dp[n-1][5]<0)dp[n-1][5]+=MOD;
		System.out.println(dp[n-1][5]);
	}

}