#include <bits/stdc++.h>
using namespace std;
int n, k;
char a[510][510];
int fa[510*510];
int siz[510*510];
int dir[4][2] = {1,0,-1,0,0,-1,0,1};
const int p = 1e9+7;
int find(int x)
{
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
void merge(int x, int y)
{
int fx = find(x);
int fy = find(y);
if (fx != fy)
siz[fx]+=siz[fy], fa[fy] = fx;
}
long long qsm(long long a, long long b)
{
long long ans = 1, t = a;
while(b)
{
if (b & 1) ans = ans *t % p;
t = t * t % p;
b >>= 1;
}
return ans % p;
}
long long ni(int x)
{
return qsm(x, p-2);
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf(" %s", a[i]+1);
n++;
for (int i = 0; i <=n*n; i++)
fa[i] = i, siz[i] = 1;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
if (a[i][j] =='1')
{
if (a[i-1][j] == '1') merge(i*n+j, (i-1)*n+j);
if (a[i+1][j] == '1') merge(i*n+j, (i+1)*n+j);
if (a[i][j-1] == '1') merge(i*n+j, i*n+j-1);
if (a[i][j+1] == '1') merge(i*n+j, i*n+j+1);
}
}
int cnt = 0;
long long ans = 1;
for (int i = 1; i <=n; i++)
for (int j = 1; j <=n; j++)
if (fa[i*n+j] == i*n+j && a[i][j] =='1') cnt++, ans = (ans * siz[i*n+j]) % p;
for (int i = 1; i <= cnt; i++)
ans = (ans * i) % p;
scanf("%d", &k);
while (k--)
{
int x, y;
scanf("%d%d", &x, &y);
x++, y++;
if (a[x][y] == '1')
{
printf("%lld\n", ans);
continue;
}
a[x][y] = '1';
cnt++;
ans = ans * cnt % p;
for (int i = 0; i < 4; i++)
{
int dx = x+dir[i][0];
int dy = y+dir[i][1];
if (a[dx][dy] == '1')
{
int f1= find(x*n+y);
int f2= find(dx*n+dy);
//cout << ans <<' '<< cnt <<' '<<f1<<':'<<siz[f1]<<' '<<f2<<':'<<siz[f2]<<endl;
if(f1 != f2)
{
//cout << ni(cnt) <<' '<<ni(siz[f1]) <<' '<<ni(siz[f2])<<endl;
ans = ans *ni(cnt) % p;
ans = ans *ni(siz[f1]) % p;
ans = ans *ni(siz[f2]) % p;
ans = ans *(siz[f1]+siz[f2]) % p;
cnt--;
merge(f1, f2);
}
}
}
printf("%lld\n", ans);
}
return 0;
}

京公网安备 11010502036488号