#include <bits/stdc++.h>
using namespace std;
const int maxn = 200, mo = 1000000000 + 7;
int n, b, k, x, s[10];
long long d[maxn];
struct node {
  long long s[maxn][maxn];
  void init() { memset(s, 0, sizeof(s)); }
  void give(node zjz) {
    for (int i = 0; i < x; i++)
      for (int j = 0; j < x; j++) s[i][j] = zjz.s[i][j];
  }
  void work(node zjz) {
    node zkj;
    zkj.init();
    for (int i = 0; i < x; i++)
      for (int j = 0; j < x; j++)
        for (int t = 0; t < x; t++) {
          zkj.s[i][j] += s[i][t] * zjz.s[t][j];
          zkj.s[i][j] %= mo;
        }
    this->give(zkj);
  }
};
node a, aa;
void ksm(int m) {
  if (m == 0) {
    for (int i = 0; i < x; i++)
      for (int j = 0; j < x; j++)
        if (i == j)
          aa.s[i][j] = 1;
        else
          aa.s[i][j] = 0;
    return;
  }
  if (m == 1) {
    aa.give(a);
    return;
  }
  ksm(m / 2);
  aa.work(aa);
  if (m % 2) aa.work(a);
}
int main() {
  cin >> n >> b >> k >> x;
  for (int i = 1; i <= n; i++) {
    int t;
    scanf("%d", &t);
    s[t]++;
  }
  a.init();
  for (int j = 0; j < x; j++)
    for (int jj = 0; jj < 10; jj++) {
      int j0 = (j * 10 + jj) % x;
      a.s[j0][j] += s[jj];
      a.s[j0][j] %= mo;
    }
  ksm(b - 1);
  for (int i = 0; i < 10; i++) d[i % x] += s[i];
  long long ans = 0;
  for (int i = 0; i < x; i++) {
    ans += aa.s[k][i] * d[i];
    ans %= mo;
  }
  cout << ans << endl;
  return 0;
}
