# Codeforces Round #425 (Div. 2), problem: (E) Vasya and Shifts Solution In C/C++

#include<bits/stdc++.h>
#define oo 0x3f3f3f3f
#define cl(x) memset(x, 0, sizeof(x))
#define mp make_pair
#define fr first
#define sc second
#define pii pair<int, int>
#define pb push_back
#define mo 1000000007
#define maxn 510
typedef long long ll;
using namespace std;
void gn(int &x) {
x = 0; char ch = getchar();
while (ch < ‘0’ || ch > ‘9’) ch = getchar();
while (ch >= ‘0’ && ch <= ‘9’)
x = x * 10 + ch – ‘0’, ch = getchar();
}
int n, m, q, end, a[maxn][maxn], x[maxn], b[maxn];
int ans;
char s[maxn], t[maxn];
void gauss() {
int p = 1;
for (int i = 1; i <= n && p <= m; ++i, ++p) {
for (int j = i; j <= n; ++j)
if (a[j][p] != 0) {
for (int k = 1; k <= m; ++k) swap(a[j][k], a[i][k]);
break;
}
if (!a[i][p]) {
–i; continue;
}
for (int j = i + 1; j <= n; ++j)
if (a[j][p] != 0) {
int t = a[j][p];
for (int k = p; k <= m; ++k) {
a[j][k] = a[j][k] * a[i][p] – a[i][k] * t;
a[j][k] = (a[j][k] % 5 + 5) % 5;
}
}
}
for (int i = 1; i <= n; ++i) {
bool flag = 1;
for (int j = 1; j <= m; ++j)
if (a[i][j]) flag = 0, end = i;
if (flag) ans = 5ll * ans % mo;
}
}
bool check() {
for (int i = 1; i <= end; ++i) {
int p = 1; while (a[i][p] == 0) ++p;
if (b[p] != 0) {
int t = b[p];
for (int k = p; k <= m; ++k) {
b[k] = b[k] * a[i][p] – a[i][k] * t;
b[k] = (b[k] % 5 + 5) % 5;
}
}
}
bool flag = 1;
for (int i = 1; i <= m; ++i)
if (b[i]) flag = 0;
return flag;
}
int main() {
gn(n); gn(m);
for (int i = 1; i <= n; ++i) {
scanf(“%s”, s + 1);
for (int j = 1; j <= m; ++j)
a[i][j] = s[j] – ‘a’;
}
ans = 1;
gauss();
gn(q);
while (q–) {
scanf(“%s”, t + 1);
for (int i = 1; i <= m; ++i) b[i] = t[i] – ‘a’;
if (check()) printf(“%d\n”, ans); else puts(“0”);
}
return 0;
}

(Visited 23 times, 1 visits today)