我开N=10就过了呀
```cpp
#include <iostream>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstring>
#include <cmath>
#include <cstdio>
#define pii pair<int, int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define test cerr << '!' << endl;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main0 ();
int main () {
#ifndef ONLINE_JUDGE
freopen("C:\\Users\\98497\\Desktop\\code\\file.in", "r", stdin);
#endif
ios::sync_with_stdio(false);
// clock_t start,end;
// start = clock();
main0();
// end = clock();
// cout << (end - start) << endl;
#ifndef ONLINE_JUDGE
fclose(stdin);
#endif
return 0;
}
const int INF = 0x3f3f3f3f;
const int N = 10;
const int M = 100;
const int mod = 1e9;
char c[N][N];
int id[N][N];
ll f[M][M];
void add (int u, int v) {
f[u][u]++;
f[v][v]++;
f[u][v]--;
f[v][u]--;
}
int main0 () {
int n, m, cnt = 0;
cin >> n >> m;
for (int i = 1;i <= n;i++) {
for (int j = 1;j <= m;j++) {
cin >> c[i][j];
if (c[i][j] == '.')
id[i][j] = ++cnt;
}
}
memset(f, 0, sizeof f);
for (int i = 1;i <= n - 1;i++)
for (int j = 1;j <= m;j++)
if ((c[i][j] == '.') && (c[i + 1][j] == '.'))
add(id[i][j], id[i + 1][j]);
for (int j = 1;j <= m - 1;j++)
for (int i = 1;i <= n;i++)
if ((c[i][j] == '.') && (c[i][j + 1] == '.'))
add(id[i][j], id[i][j + 1]);
// for (int i = 1;i <= cnt;i++) {
// for (int j = 1;j <= cnt;j++) cout << f[i][j] << ' ';
// cout << endl;
// }
ll ans = 1;
for (int i = 1;i < cnt;i++) {
for (int j = i + 1;j < cnt;j++) {
while (f[j][i]) {
ll t = f[i][i] / f[j][i];
for (int k = i;k < cnt;k++)
f[i][k] = (f[i][k] - t * f[j][k] + mod) % mod;
swap(f[i], f[j]);
ans *= -1;
}
}
ans *= f[i][i];
ans %= mod;
}
ans += mod;
ans %= mod;
cout << ans << endl;
}
by Nanarikom @ 2019-10-19 23:53:42
点数是$O(nm)$的,所以矩阵数组应该开$100\times100$。。。
by kkksx @ 2019-12-13 20:39:16