func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXN = 1e6 + 10;   const int MOD = 1e9 + 7;   int n, l, m;   struct Matrix {     int mat[105][105];     void init() { memset(mat, 0, sizeof mat); }   };   Matrix operator*(Matrix A, Matrix B) {     Matrix C;     C.init();     for (int i = 0; i < m; i++) {       for (int j = 0; j < m; j++) {         for (int k = 0; k < m; k++) {           C.mat[i][j] =               (C.mat[i][j] + 1LL * A.mat[i][k] * B.mat[k][j] % MOD) % MOD;         }       }     }     return C;   }   Matrix operator^(Matrix A, int k) {     Matrix B;     B.init();     for (int i = 0; i < m; i++) B.mat[i][i] = 1;     while (k) {       if (k & 1) B = B * A;       A = A * A;       k >>= 1;     }     return B;   }   int a[105];   int b[MAXN];   template <class T>   inline void scan_d(T &ret) {     char c;     ret = 0;     while ((c = getchar()) <  0  || c >  9 )       ;     while (c >=  0  && c <=  9 ) ret = ret * 10 + (c -  0 ), c = getchar();   }   int main() {     Matrix B;     B.init();     scanf( %d%d%d , &n, &l, &m);     for (int i = 0; i < n; i++) {       int x;       scan_d(x);       int d = x % m;       B.mat[0][d]++;     }     for (int i = 0; i < n; i++) {       int x;       scan_d(x);       a[x % m]++;       b[i] = x % m;     }     Matrix A;     A.init();     for (int i = 0; i < m; i++) {       int zz = i;       for (int j = 0; j <= i; j++) {         A.mat[j][i] = a[zz--];       }       zz = m - 1;       for (int j = i + 1; j < m; j++) {         A.mat[j][i] = a[zz--];       }     }     A = A ^ (l - 2);     A = B * A;     B.init();     for (int i = 0; i < n; i++) {       int x;       scan_d(x);       (b[i] += x) %= m;       int d = b[i];       if (d) d = m - d;       B.mat[d][0]++;     }     A = A * B;     cout << A.mat[0][0] << endl;     return 0;   }   