#include <bits/stdc++.h>
using namespace std;
const int MAXN = 105;
const int mod = 1e9 + 7;
int n, b, k, x;
int dp[MAXN][MAXN];
int occ[10];
inline int Add(int a, int b) {
  int ret = a + b;
  if (ret >= mod) ret -= mod;
  return ret;
}
inline int Mult(int a, int b) { return (int)((long long)a * b % mod); }
struct Matrix {
  int mat[MAXN][MAXN];
  Matrix() {}
  Matrix(int val) { memset(mat, val, sizeof mat); }
  int &operator()(int a, int b) { return mat[a][b]; }
  int operator()(int a, int b) const { return mat[a][b]; }
};
Matrix operator*(const Matrix &A, const Matrix &B) {
  Matrix C(0);
  for (int i = 0; i < x; i++)
    for (int j = 0; j < x; j++)
      for (int k = 0; k < x; k++)
        C(i, j) = Add(C(i, j), Mult(A(i, k), B(k, j)));
  return C;
}
void Pot(Matrix &baza, Matrix &poc, int e) {
  while (e) {
    if (e & 1) poc = poc * baza;
    baza = baza * baza;
    e >>= 1;
  }
}
int main() {
  scanf("%d %d %d %d", &n, &b, &k, &x);
  for (int i = 0; i < n; i++) {
    int x;
    scanf("%d", &x);
    occ[x]++;
  }
  Matrix dp(0);
  for (int i = 0; i < x; i++)
    for (int j = 0; j < x; j++)
      for (int a = 1; a <= 10; a++) {
        if ((j * 10 + a) % x == i) dp(i, j) = Add(dp(i, j), occ[a]);
      }
  Matrix poc(0);
  for (int i = 0; i < x; i++) poc(i, i) = 1;
  Pot(dp, poc, b);
  printf("%d\n", poc(k, 0) % mod);
  return 0;
}
