放一份爆搜代码(能跑过所有数据,5 5 在十分钟左右?):
#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i = x;i <= y; ++ i)
#define repd(i,x,y) for(register int i = x;i >= y; -- i)
using namespace std;
typedef long long ll;
template<typename T>inline void read(T&x)
{
char c;int sign = 1;x = 0;
do { c = getchar(); if(c == '-') sign = -1; } while(!isdigit(c));
do { x = x * 10 + c - '0'; c = getchar(); }while(isdigit(c));
x *= sign;
}
int n,m,t;
int a[7][7],c[7][7];
map<int,bool>mp;
inline void nxt()
{
rep(i,1,n) rep(j,1,m) c[i][j] = a[i][j];
rep(i,1,n) rep(j,1,m)
{
int z = a[i][j-1] + a[i-1][j] + a[i-1][j-1] + a[i+1][j] + a[i][j+1] +
a[i-1][j+1] + a[i+1][j-1] + a[i+1][j+1];
if( z == 2) continue;
if( z == 3) c[i][j] = 1;
else c[i][j] = 0;
}
rep(i,1,n) rep(j,1,m) a[i][j] = c[i][j];
}
inline int get()
{
int ans = 0;
rep(i,1,n) rep(j,1,m)
ans = ans<<1|a[i][j];
return ans;
}
inline bool check(int x)
{
memset(a,0,sizeof a);
int i = 1,j = 1;
while(x)
{
a[i][j] = x & 1;
x >>= 1;
++ j ;if(j > m) j = 1,++i;
}
mp.clear();
int now;
while(!mp[now=get()])
{
if(!now) return false;
mp[now] = true;
nxt();
}
return true;
}
inline int solve(int n,int m)
{
int ans = 0,s = (1 << (n * m)) - 1;
rep(i,0,s) if(check(i))
++ ans;
return ans;
}
int b[6][6];
int main()
{
read(n); read(m);
printf("%d\n",solve(n,m));
b[2][2] = 5;
b[2][3] = 18;
b[2][4] = 73;
b[2][5] = 267;
b[3][3] = 150;
b[3][4] = 1533;
b[3][5] = 11398;
b[4][4] = 31828;
b[4][5] = 469972;
b[5][5] = 12785753;
read(t);
while(t--)
{
read(n); read(m);
if(n > m) swap(n,m);
printf("%d\n",b[n][m]);
}
return 0;
}