#include <bits/stdc++.h>
using namespace std;
const int INF = (int)2e9;
const long long INFL = (long long)9e18;
const int MAXINT = ((~0) ^ (1 << 31));
const long long MAXLL = ((~0) ^ ((long long)1 << 63));
template <class T>
inline T pow2(T a) {
  return a * a;
}
template <class T>
inline bool mineq(T& a, T b) {
  return (a > b) ? (a = b, true) : false;
}
template <class T>
inline bool maxeq(T& a, T b) {
  return (a < b) ? (a = b, true) : false;
}
const int maxn = 2e2, maxn2 = 1e5, mod = 1e9 + 7;
long long n, b, k, x, m[40][maxn][maxn], a[maxn2], res[maxn][maxn];
void mul(long long n, long long ans[maxn][maxn], long long a[maxn][maxn],
         long long b[maxn][maxn]) {
  long long t[maxn][maxn];
  for (int i = 0; i < n; i++) memset(t[i], 0, sizeof t[i]);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      for (int z = 0; z < n; z++)
        t[i][j] = (t[i][j] + (a[i][z] * b[z][j] + mod) % mod + mod) % mod;
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) ans[i][j] = t[i][j];
  }
}
void pow(long long n, long long ans[maxn][maxn], long long t[maxn][maxn],
         long long k) {
  for (int i = 0; i < n; i++) memset(ans[i], 0, sizeof ans[i]);
  if (k == 0) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) ans[i][j] = (i == j);
    }
    return;
  }
  pow(n, ans, t, k / 2);
  mul(n, ans, ans, ans);
  if (k % 2 != 0) mul(n, ans, t, ans);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n >> b >> k >> x;
  for (int i = 0; i < n; i++) cin >> a[i];
  for (int i = 0; i < x; i++) {
    for (int j = 0; j < n; j++) m[0][i][(10 * i + a[j]) % x]++;
  }
  for (int i = 1; i < 40; i++) mul(x, m[i], m[i - 1], m[i - 1]);
  pow(x, res, m[0], b);
  cout << res[0][k];
}
