Problem:
Problem A : ID

A大学ではIDの入力ミスが多発していた。

そこで、A大学は入力ミス防止のため新しいIDを発行することにした。

新しいIDには入力ミス防止のためにIDが正しいかどうかチェックする方法がある。

・全ての桁の数字の総和を求める。

・ただし、右端の桁を１番目として、偶数番目の桁の数字を２倍にする。

・２倍することによって数字が１０以上になった時、１の位の数字と１０の位の数字を加算した数字をその桁の数字とする。

・総和が１０で割り切れれば正しいID、そうでなければ間違いとする。

例として、53579というIDをチェックする。

全ての桁の数字の総和を求めるので、

5 + 3 + 5 + 7 + 9

ただし、偶数番目の桁の数字を２倍にするので、

5 + 6 + 5 + 14 + 9

２倍することによって数字が１０以上になった時、１の位の数字と１０の位の数字を加算した数字をその桁の数字とするので、

5 + 6 + 5 + (1 + 4) + 9

以上より、総和は30となる。30は10で割り切れるので、53579は正しいIDである。

B君はA大学の大学生であり、新しいIDを発行してもらったが、IDの一部の桁を忘れてしまった。

しかし、忘れてしまった部分にどんな数字が入るか、いくつか候補を絞ることに成功した。

あなたの仕事は、B君のIDの正しい組み合わせが何通りあるかを求めることである。

Input

入力は以下のフォーマットで与えられる。

n
ID
m
a0 a1 ... am-1

nはIDの桁の数である。

IDの各桁には0~9の数字または忘れた桁であるということを示す'*'という文字が入る。

mは'*'に入る数字の候補の数である。

aiは'*'に入る数字の候補である。

入力は以下の制約を満たす

1 ≤ n ≤ 100,000

1 ≤ m ≤ 10

0 ≤ ai ≤ 9

1 ≤ '*'の数 ≤ 7

Output

答えの値を１行に出力せよ

Sample Input 1

5
5*57*
2
3 9

Sample Output 1

1

Sample Input 2

15
2***9*2*6*1199*
9
0 1 2 3 4 6 7 8 9

Sample Output 2

478297

Solution in JAVA (judge verdict: Time Limit Exceeded)

import java.io.*;
import java.util.*;

class Main{
    static int num=0, n;
    static int[] box;
    public static void main(String[] args){
	BufferedReader sc=new BufferedReader(new InputStreamReader(System.in));
	try {
	    n = Integer.valueOf(sc.readLine());
	    String inp = sc.readLine();
	    int m = Integer.valueOf(sc.readLine());
	    String[] st = sc.readLine().split(" ");
	    box = new int[m];
	    for(int i=0; i<m; i++)
		box[i] = Integer.valueOf(st[i]);
	    int start = -1;
	    for(int i=0; i<n; i++)
		if(inp.charAt(i)=='*'){
		    start = i;
		    break;
		}
	    int[] tmp = new int[n];
	    for(int i=0; i<n; i++)
		if(inp.charAt(i)=='*')
		    tmp[i] = -1;
		else
		    tmp[i] = (int)(inp.charAt(i)-'0');
	    solve(tmp,start);
	    System.out.println(num);
	}catch(Exception e){
	    System.out.println("Error");
	}
    }
    static void solve(int[] tmp, int start){
	if(start == -1){
	    int ap = 0;
	    if(n%2==1){
		ap+=tmp[0];
		for(int i=1; i<n; i+=2){
		    int t = 2*tmp[i];
		    if(t>=10)
			t = t/10+t%10;
		    ap+=t+tmp[i+1];
		}
	    }
	    else
		for(int i=0; i<n; i+=2)
		    ap+=2*tmp[i]+tmp[i+1];
	    if(ap%10==0)
		num++;
	    return;
	}
	int zz = start;
	for(int u: box){
	    tmp[zz] = u;
	    boolean flag = false;
	    for(int i=zz; i<n; i++)
		if(tmp[i]==-1){
		    start = i;
		    flag = true;
		    break;
		}
	    if(!flag)
		start = -1;
	    solve(tmp,start);
	    tmp[zz]=-1;
	}
    }
}