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

import Data.Char
import Data.List

select :: Int -> [Int] -> [[Int]]
select 0 _ = [[]]
select _ [] = [[]]
select n list =
    [ (x:xs) | x <- list, xs <- (select (n-1) $ filter (>= x) list) ]

------------------------------------------------
f :: Int -> Int
f n = if n >= 5
      then 1 + ( (n-5) * 2 )
      else n * 2

-- (*??\???????¨???????????\???°?????????*?????°?????¶??°?????????*?????°)
ev :: [Char] -> (Int,Int,Int)
ev [] = (0,0,0)
ev ('*':ns) =
  let (a,b,c) = od ns
  in
    (a,b,c+1)

ev (n:ns) =
  let v = f $ digitToInt n
      (a,b,c) = od ns
  in
    (a+v,b,c)

od :: [Char] -> (Int,Int,Int)
od [] = (0,0,0)
od ('*':ns) =
  let (a,b,c) = ev ns
  in
    (a,b+1,c)

od (n:ns) =
  let n' = digitToInt n
      (a,b,c) = ev ns
  in 
     (a+n',b,c)   
------------------------------------------------

fact 1 = 1
fact n = n * fact(n-1)

cnv :: [Int] -> [(Int,Int)]
cnv [] = []
cnv x@(x0:xs) =
  let l = length $ takeWhile (==x0) x
  in
    (x0,l):(cnv $ dropWhile (==x0) x)

comb :: [Int] -> Int
comb x =
  let l = fact $ length x
      m = product $ map (\(a,b) -> fact b) $ cnv x
  in
    l `div` m

chk :: Int -> [Int] -> Int
chk p yc =
  let y = sum $ map f yc
      v = p + y
  in
    if v `mod` 10 == 0
    then comb yc
    else 0

solve'' :: Int -> Int -> [Int] -> Int
solve'' p y set =
  let ycs = select y set
      res = map (\yc -> chk p yc) ycs
  in
    sum res

solve' :: Int -> Int -> [Int] -> [Int] -> Int
solve' p y set xc =
  let c  = comb xc
      p' = p + sum xc
  in
    c * solve'' p' y set

solve id set = 
  let (p,x,y) = od id -- (*??\???????¨???????????\???°?????????*?????°?????¶??°?????????*?????°)
      xcs = select x set
      res = map (solve' p y set ) xcs
  in
    sum res

main = do
  c <- getContents
  let l = lines c
      n  = read (l!!0) :: Int
      id = reverse $ l!!1
      m  = read (l!!2) :: Int
      s  = map read $ words (l!!3) :: [Int]
      o  = solve id s
  print o