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: Wrong Answer)

import java.util.*;
import java.math.*;
import java.awt.geom.*;
import java.io.*;
     
     
public class Main {
	static int W;
	static int H;
	static int N;
	static boolean[][] fld;
	static int[] vx = new int[] {0,1,0,-1};
	static int[] vy = new int[] {1,0,-1,0};
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[] num = new int[n];
		String in = sc.next();
		for(int i = 0; i < n; i++) {
			if(in.charAt(i) == '*') {
				num[i] = -1;
			}
			else {
				num[i] = in.charAt(i) - '0';
			}
		}
		int m = sc.nextInt();
		int[] c = new int[m];
		for(int i = 0; i < m; i++) {
			c[i] = sc.nextInt();
		}
		long[][] dp = new long[n+1][10];
		dp[0][0] = 1;
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < 10; j++) {
				if(num[i] != -1) {
					int tmp = 0;
					if((n - i) % 2 == 0) {
						tmp = num[i]*2;
						if(tmp >= 10) {
							switch(tmp) {
								case 10: tmp = 1; break;
								case 11: tmp = 2; break;
								case 12: tmp = 3; break;
								case 13: tmp = 4; break;
								case 14: tmp = 5; break;
								case 15: tmp = 6; break;
								case 16: tmp = 7; break;
								case 17: tmp = 8; break;
								case 18: tmp = 9; break;
							}
						}
					}
					else {
						tmp = num[i];
					}
					tmp += j;
					tmp %= 10;
					dp[i+1][tmp] += dp[i][j];
				}
				else {
					for(int k = 0; k < m; k++) {
						int tmp = 0;
						if((n - i) % 2 == 0) {
							tmp = c[k]*2;
							if(tmp >= 10) {
								switch(tmp) {
								case 10: tmp = 1; break;
								case 11: tmp = 2; break;
								case 12: tmp = 3; break;
								case 13: tmp = 4; break;
								case 14: tmp = 5; break;
								case 15: tmp = 6; break;
								case 16: tmp = 7; break;
								case 17: tmp = 8; break;
								case 18: tmp = 9; break;
								}
							}
						}
						else {
							tmp = c[k];
						}
						tmp += j;
						tmp %= 10;
						dp[i+1][tmp] += dp[i][j];
					}
				}
			}
		}
		long sum = 0;
		for(int i = 0; i < 10; i++) {
			sum += dp[n][i];
		}
		System.out.println(sum);
		
	}
	static int dfs(int now, int[] num, int[] c) {
		if(now == num.length) {
			return check(num)?1:0;
		}
		if(num[now] != -1) return dfs(now+1,num,c);
		int ret = 0;
		for(int i = 0; i < c.length; i++) {
			num[now] = c[i];
			ret += dfs(now+1,num,c);
		}
		num[now] = -1;
		return ret;
	}
	static boolean check(int[] a) {
		int sum = 0;
		for(int i = a.length-1; i >= 0; i--) {
			if((a.length - i) % 2 == 0) {
				int tmp = a[i]*2;
				if(tmp >= 10) {
					switch(tmp) {
					case 10: tmp = 1; break;
					case 11: tmp = 2; break;
					case 12: tmp = 3; break;
					case 13: tmp = 4; break;
					case 14: tmp = 5; break;
					case 15: tmp = 6; break;
					case 16: tmp = 7; break;
					case 17: tmp = 8; break;
					case 18: tmp = 9; break;
					}
				}
				sum += tmp;
			}
			else {
				sum += a[i];
			}
		}
		return sum % 10 == 0;
	}
}