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