func_code_string: #include <bits/stdc++.h>   using namespace std;   const double PI = acos(-1.0);   double fRand(double fMin, double fMax) {     double f = (double)rand() / RAND_MAX;     return fMin + f * (fMax - fMin);   }   template <class T>   T min(T a, T b, T c) {     return min(a, min(b, c));   }   template <class T>   T max(T a, T b, T c) {     return max(a, max(b, c));   }   struct matrix {     vector<vector<int> > a;     int m, n;     matrix(int _m, int _n) {       m = _m;       n = _n;       a.resize(m);       for (int i = (0); i <= (m - 1); ++i) a[i].resize(n);     }     bool inline operator==(const matrix &o) const {       if (m != o.m || n != o.n) return false;       for (int i = (0); i <= (m - 1); ++i) {         for (int j = (0); j <= (n - 1); ++j) {           if (a[i][j] != o.a[i][j]) return false;         }       }       return true;     }     void inline operator=(const matrix &o) {       m = o.m;       n = o.n;       for (int i = (0); i <= (m - 1); ++i) {         for (int j = (0); j <= (n - 1); ++j) a[i][j] = o.a[i][j];       }     }     matrix inline operator*(const matrix &o) const {       matrix c(m, o.n);       for (int i = (0); i <= (m - 1); ++i) {         for (int j = (0); j <= (o.n - 1); ++j) {           c.a[i][j] = 0;           for (int k = (0); k <= (n - 1); ++k)             c.a[i][j] = (c.a[i][j] + 1LL * a[i][k] * o.a[k][j]) % 1000000007;         }       }       return c;     }     void print() {       for (int i = (0); i <= (m - 1); ++i) {         for (int j = (0); j <= (n - 1); ++j) printf( %d  , a[i][j]);         puts(  );       }       puts(  );     }   };   matrix Identity(int n) {     matrix I(n, n);     for (int i = (0); i <= (n - 1); ++i) I.a[i][i] = 1;     return I;   }   matrix matPow(matrix A, int n) {     if (n == 0) return Identity(A.m);     if (n % 2 == 1) return A * matPow(A, n - 1);     matrix B = matPow(A, n / 2);     return B * B;   }   int n, l, M, c[3][1000005], dpp[105], last[105];   int main() {     scanf( %d%d%d , &n, &l, &M);     for (int i = (0); i <= (2); ++i)       for (int j = (1); j <= (n); ++j) scanf( %d , &c[i][j]);     matrix A(1, M);     for (int i = (1); i <= (n); ++i) ++A.a[0][c[0][i] % M];     for (int i = (1); i <= (n); ++i) ++dpp[c[1][i] % M];     matrix B(M, M);     for (int i = (0); i <= (M - 1); ++i)       for (int j = (0); j <= (M - 1); ++j) B.a[i][j] = dpp[(j - i + M) % M];     matrix C = A * matPow(B, l - 2);     for (int i = (1); i <= (n); ++i) {       ++last[(c[1][i] + c[2][i]) % M];     }     int ans = 0;     for (int i = (0); i <= (M - 1); ++i) {       ans = (ans + 1LL * last[i] * C.a[0][(M - i) % M]) % 1000000007;     }     printf( %d , ans);     return 0;   }   