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.io.IOException;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Scanner;

public class Main {
	
	public static int search(int sum, int count, int size, int o_size, int m, int[] odd, int[] even){
		if(count == size){
			return sum == 0 ? 1 : 0;
		}
		
		int ret = 0;
		for(int i = 0; i < m; i++){
			if(count < o_size){
				ret += search((sum + odd[i]) % 10, count + 1, size, o_size, m, odd, even);
			}else{
				ret += search((sum + even[i]) % 10, count + 1, size, o_size, m, odd, even);
			}
		}
		
		return ret;
	}

	public static void main(String[] args) {
		final Scanner sc = new Scanner(System.in);

		final int n = sc.nextInt();
		final char[] str = sc.next().toCharArray();
		final int m = sc.nextInt();
		int[] a = new int[m];
		
		for(int i = 0; i < m; i++){
			a[i] = sc.nextInt();
		}
		
		int[] odd_mod = new int[m];
		int[] even_mod = new int[m];
		
		for(int i = 0; i < m; i++){
			odd_mod[i] = a[i];
			even_mod[i] = ((a[i] * 2) / 10) + ((a[i] * 2) % 10);
		}
		
		int odd_count = 0, even_count = 0;
		int first_mod = 0;
		
		for(int i = 0; i < str.length; i++){
			if((i + 1) % 2 == 1){
				if(str[i] == '*'){
					odd_count++;
				}else{
					first_mod += (str[i] - '0');
					first_mod %= 10;
				}
			}else{
				if(str[i] == '*'){
					even_count++;
				}else{
					first_mod += ((str[i] - '0') * 2) / 10 + ((str[i] - '0') * 2) % 10;
					first_mod %= 10;
				}
			}
		}
		
		if(odd_count == 0 && even_count == 0){
			System.out.println(first_mod == 0 ? 1 : 0);
			return;
		}
		//System.out.println(first_mod);
		
		/*
		long[][] dp = new long[odd_count + even_count][10];
		for(int i = 0; i < odd_count + even_count; i++){
			if(i == 0){
				if(i < odd_count){
					for(int j = 0; j < m; j++){
						dp[i][(first_mod + odd_mod[j]) % 10]++;
					}
				}else{
					for(int j = 0; j < m; j++){
						dp[i][(first_mod + even_mod[j]) % 10]++;
					}
				}
			}else{
				if(i < odd_count){
					for(int j = 0; j < 10; j++){
						for(int k = 0; k < m; k++){
							dp[i][(j + odd_mod[k]) % 10] += dp[i-1][j];
						}
					}
				}else{
					for(int j = 0; j < 10; j++){
						for(int k = 0; k < m; k++){
							dp[i][(j + even_mod[k]) % 10] += dp[i-1][j];
						}
					}
				}
			}
			System.out.println(Arrays.toString(dp[i]));
		}
		*/
		System.out.println(search(first_mod, 0, odd_count + even_count, odd_count, m, odd_mod, even_mod));
	}

}