func_code_string: #include <bits/stdc++.h>   using namespace std;   const int mod = 1e9 + 7;   const int N = 1e6 + 5;   long long dp[105], cnt[105], b[N], a[N];   void add(long long &a, long long b) {     a += b;     if (a >= mod) a -= mod;   }   struct Mat {     long long t[101][101];     Mat() { memset(t, 0, sizeof t); }   } I;   int m;   Mat operator*(Mat a, Mat b) {     Mat c;     for (int i = 0; i < m; i++)       for (int j = 0; j < m; j++) {         long long t = 0;         for (int k = 0; k < m; k++) {           add(c.t[i][j], a.t[i][k] * b.t[k][j] % mod);         }       }     return c;   }   Mat Pow(Mat a, int b) {     Mat c = I;     while (b) {       if (b & 1) c = c * a;       a = a * a;       b >>= 1;     }     return c;   }   int main() {     int n, l, x;     cin >> n >> l >> m;     for (int i = 0; i < m; i++) dp[i] = 0, cnt[i] = 0;     for (int i = 1; i <= n; i++) scanf( %d , &x), dp[x % m]++;     for (int i = 1; i <= n; i++) scanf( %lld , &a[i]), cnt[a[i] % m]++;     for (int i = 1; i <= n; i++) scanf( %lld , &b[i]);     for (int i = 0; i < m; i++) I.t[0][i] = dp[i];     Mat pi;     for (int i = 0; i < m; i++)       for (int j = 0; j < m; j++) pi.t[i][j] = cnt[(m - i + j) % m];     Mat ans = Pow(pi, l - 2);     for (int i = 0; i < m; i++) cnt[i] = 0, dp[i] = 0;     for (int i = 1; i <= n; i++) {       cnt[(a[i] + b[i]) % m]++;     }     for (int i = 0; i < m; i++)       for (int j = 0; j < m; j++)         add(dp[(j + i) % m], ans.t[0][j] * cnt[i] % mod);     printf( %lld n , dp[0]);   }   