func_code_string: #include <bits/stdc++.h>   static const int MOD = 1000000007;   using ll = long long;   using u32 = unsigned;   using u64 = unsigned long long;   using namespace std;   template <class T>   constexpr T INF = ::numeric_limits<T>::max() / 32 * 15 + 208;   template <u32 M = 1000000007>   struct modint {     u32 val;     modint() : val(0) {}     template <typename T>     modint(T t) {       t %= (T)M;       if (t < 0) t += (T)M;       val = t;     }     modint pow(ll k) const {       modint res(1), x(val);       while (k) {         if (k & 1) res *= x;         x *= x;         k >>= 1;       }       return res;     }     template <typename T>     modint& operator=(T t) {       t %= (T)M;       if (t < 0) t += (T)M;       val = t;       return *this;     }     modint inv() const { return pow(M - 2); }     modint& operator+=(modint a) {       val += a.val;       if (val >= M) val -= M;       return *this;     }     modint& operator-=(modint a) {       if (val < a.val)         val += M - a.val;       else         val -= a.val;       return *this;     }     modint& operator*=(modint a) {       val = (u64)val * a.val % M;       return *this;     }     modint& operator/=(modint a) { return (*this) *= a.inv(); }     modint operator+(modint a) const { return modint(val) += a; }     modint operator-(modint a) const { return modint(val) -= a; }     modint operator*(modint a) const { return modint(val) *= a; }     modint operator/(modint a) const { return modint(val) /= a; }     modint operator-() { return modint(M - val); }     bool operator==(const modint a) const { return val == a.val; }     bool operator!=(const modint a) const { return val != a.val; }     bool operator<(const modint a) const { return val < a.val; }   };   using mint = modint<MOD>;   int main() {     int n, m;     cin >> n >> m;     vector<vector<int>> v(n, vector<int>(m, 0));     string s;     for (int i = 0; i < n; ++i) {       cin >> s;       for (int j = 0; j < m; ++j) {         v[i][j] = s[j] -  a ;       }     }     int q;     cin >> q;     v.resize(n + q, vector<int>(m, 0));     for (int i = 0; i < q; ++i) {       cin >> s;       for (int j = 0; j < m; ++j) {         v[n + i][j] = s[j] -  a ;       }     }     vector<int> inv = {0, 1, 3, 2, 4};     int rank = 0;     for (int c = 0; c < m; ++c) {       int k = -1;       for (int i = rank; i < n; ++i) {         if (v[i][c]) {           k = i;           break;         }       }       if (!~k) continue;       swap(v[k], v[rank]);       int x = inv[v[rank][c]];       for (int j = 0; j < m; ++j) v[rank][j] = (v[rank][j] * x) % 5;       for (int i = 0; i < n + q; ++i) {         if (i != rank && v[i][c]) {           int coeff = v[i][c];           for (int j = 0; j < m; ++j) {             v[i][j] -= v[rank][j] * coeff % 5;             if (v[i][j] < 0) v[i][j] += 5;           }         }       }       rank++;     }     int ans = mint(5).pow(n - rank).val;     for (int i = 0; i < q; ++i) {       int ok = 1;       for (int j = 0; j < m; ++j) {         if (v[n + i][j]) ok = 0;       }       printf( %d n , ok ? ans : 0);     }     return 0;   }   