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 (GCC 5.4.1) (judge verdict: Runtime Error)

#include<stdio.h>
#include<stdlib.h>

#define NEW(p,n){p=malloc((n)*sizeof(p[0]));if(p==NULL){printf("not enough memory\n");exit(1);};}
//pの型の変数n個の要素分のメモリを確保し、そのアドレスをpに代入するマクロ

#define N 1000000007;

//char型のポインタ(=配列と意味は同じ)をString型と定義([0]から数える)
typedef char* String;

//S[0]から始まる文字列の長さを求める関数
int string_len(String str){
    int len=0;
    while(str[len]!=0){
        len++;
    }
    return len;
}

//文字列を標準入力から読み込み、それをString型のメモリを確保し直してくれる関数
//S[0]~S[n-1]までが入力で、S[n]は0になる
//文字列長さの上限は1000まで
String string_input(void){
    int i,len;
    char buf[10001];
    String str;
    scanf("%s",buf);//buf=入力した文字列が入るchar型の配列
    
    len=string_len(buf);//len=文字列の長さを表すint型変数
    NEW(str,len+1);//strはただのポインタだから、ここでNEWを使ってメモリを確保しなくちゃいけない
    for(i=0;i<len;i++){
        str[i]=buf[i];
    }
    str[len]=0;
    
    return str;
}

//char→int
int ctoi(char c) {
	if (c >= '0' && c <= '9') {
		return c - '0';
	}
	return 0;
}

int main(void){
    //0桁目~n-1桁目まで
    String S=string_input();
    int n=string_len(S);

    //10^iの、13で割ったあまり
    int r[6]={1,10,9,12,3,4};

    //下からi桁目は、S[n-1-i]
    //DP[i][j]に、下からi桁目までで13で割ってjになるものがいくつあるのかを格納
    //iは0~n-1まで、jは0~12まで
    int DP[n][13];
    for(int i=0;i<n;i++){
        for(int j=0;j<13;j++) DP[i][j]=0;
    }

    //DP[0]を埋める
    if(S[n-1]!='?'){
        DP[0][ctoi(S[n-1])]=1;
    }
    else{
        for(int i=0;i<10;i++) DP[0][i]=1;
    }

    //DP[1]以降を埋める
    for(int i=1;i<n;i++){
        //その桁を考慮することによってどれだけあまりが増えるか
        int add;
        char c=S[n-1-i];
        int ci;
        if(c!='?'){
            ci=ctoi(c);
            add=(ci*r[i%6])%13;
            for(int j=0;j<13;j++) DP[i][(j+add)%13]=(DP[i][(j+add)%13]+DP[i-1][j])%N;
        }
        else{
            for(int k=0;k<10;k++){
                ci=k;
                add=(ci*r[i%6])%13;
                for(int j=0;j<13;j++) DP[i][(j+add)%13]=(DP[i][(j+add)%13]+DP[i-1][j])%N;
            }
        }
    }
    
    printf("%d\n",DP[n-1][5]);

    return 0;
}

//0始まりの習慣をつけたほうがいい(heap除く)
//DPするのがどういうときだかわかんねえ……