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 C (judge verdict: Accepted)

#include <stdio.h>

int n;
char id[100004];
int m;
char kouho[10];
int starNum;
int starPos[10];
char starMozi[10];

int getNonStarCheckSum(void) {
	int checkSum=0;
	int i;
	for(i=0;id[i];i++) {
		if(id[i]!='*') {
			int now=id[i]-'0';
			if((n-i)%2==0) {
				now*=2;
				if(now>=10)now=(now/10)+(now%10);
			}
			checkSum+=now;
		}
	}
	return checkSum;
}

int getStarCheckSum(void) {
	int checkSum=0;
	int i;
	for(i=0;i<starNum;i++) {
		int now=starMozi[i]-'0';
		if((n-starPos[i])%2==0) {
			now*=2;
			if(now>=10)now=(now/10)+(now%10);
		}
		checkSum+=now;
	}
	return checkSum;
}

int main(void) {
	int i;
	int nsc;
	int sc;
	int tansaku,tansakumax;
	int count;
	scanf("%d",&n);
	scanf("%s",id);
	scanf("%d",&m);
	for(i=0;i<m;i++) {
		char buf[4];
		scanf("%s",buf);
		kouho[i]=buf[0];
	}
	for(i=0;id[i];i++) {
		if(id[i]=='*')starPos[starNum++]=i;
	}
	nsc=getNonStarCheckSum();
	tansakumax=1;
	count=0;
	for(i=0;i<starNum;i++)tansakumax*=m;
	for(tansaku=0;tansaku<tansakumax;tansaku++) {
		int tansakubuf=tansaku;
		for(i=0;i<starNum;i++) {
			starMozi[i]=kouho[tansakubuf%m];
			tansakubuf/=m;
		}
		if((nsc+getStarCheckSum())%10==0)count++;
	}
	printf("%d\n",count);
	return 0;
}