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: Runtime Error)

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;


public class Main {
	
	static int n=0;
	static int m=0;
	static int sum=0;
	static long cand=0;
	static ArrayList<Integer> a = new ArrayList<Integer>();
	static String id_str;
	static ArrayList<Character> id = new ArrayList<Character>();
	
	public static void main (String[] args){
		
		Scanner scan1 = new Scanner(System.in);
		
		n = scan1.nextInt();
		id_str = scan1.next();
		m = scan1.nextInt();
		for(int i=0; i<m; i++) a.add(scan1.nextInt());

		scan1.close();
		
		for(int i=0; i<n; i++) id.add(id_str.charAt(i));
		
		Collections.reverse(id);

		search(0);
		
		System.out.println(cand);
	}
	
	public static long search(int depth){
		if(depth<n){
			if(id.get(depth) == '*'){
				for(int i=0; i<m; i++){
					if(depth%2==0){
						sum += a.get(i);
					}else{
						sum += (a.get(i)*2)%10 + (a.get(i)*2)/10;
					}
					
					depth++;
					search(depth);
					depth--;
					if(depth%2==0){
						sum -= a.get(i);
					}else{
						sum -= (a.get(i)*2)%10 + (a.get(i)*2)/10;
					}
				}
			}else{
				if(depth%2==0){
					sum += Integer.parseInt("" + id.get(depth));
				}else{
					sum += (Integer.parseInt("" + id.get(depth))*2)%10 + (Integer.parseInt("" + id.get(depth))*2)/10;
				}
				
				depth++;
				search(depth);
				depth--;
				if(depth%2==0){
					sum -= Integer.parseInt("" + id.get(depth));
				}else{
					sum -= (Integer.parseInt("" + id.get(depth))*2)%10 + (Integer.parseInt("" + id.get(depth))*2)/10;
				}
			}
		}else{

			if(sum%10 == 0) cand++;

		}
		return cand;
	}
	
}