func_code_string: #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;   }   