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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#define rep(i, n) for(int i = 0; i < (int)(n); i++)
#define all(x) (x).begin(),(x).end()
typedef long long ll;
// #include<C:\Users\J\Desktop\AC\athead.h>
#define showa(v) for(int iii = 0; iii < v.size(); iii++){ cout << v[iii] << " ";} cout << endl;
#define show(iiii) cout << iiii << endl; 
#define shows(iiiii) cout << iiiii << " ";
#include<iostream>
#include<string>
#include<vector>
#include<stdio.h>
#include <cmath>
#include <cstdlib>
#include <cassert>
#include <algorithm>
#include <set>
#include <deque>
#include <numeric>
#include<tuple>
#include <utility>
#include <map>
#define waru 1000000000+7

using namespace std;

int main(){
    string s;
    cin >> s;
    // showa(s)
    
    reverse(all(s));

    int a = 5;
    int res = 0;

    while(true){
        string ss = to_string(a);
         reverse(all(ss));
        // show(ss[0])
        if(ss.size() > s.size()){
            break;
        }
        // shows(a) show(res)
        int plus = 1;
        for(int i = 0; i < s.size(); i++){
            // shows(s[i]) show(ss[i])
            if(i < ss.size()){
                if(s[i] != '?' && s[i] != ss[i] ){
                    // cout << '!'<<endl;
                    plus = 0;
                    break;
                }
            }
            else{
                if(s[i] != '?' && s[i] != '0' ){
                    // cout << '!'<<endl;
                    plus = 0;
                    break;
                }
            }

        }
        res = (res + plus)%waru;
        a += 13;
    }
    cout << res;
}