题目大意
一个M*N的棋盘, 有一个棋子每次可以向上下左右4个方向中的1个走1步,让这个棋子从(1,1)位置出发,走遍所有格子恰好1次,最后回到(1,1),有多少种不同的走法。由于方案数量巨大,输出数量Mod 10^9 + 7即可。
M≤ 109
N≤5
分析
题目相当于求一条哈密顿回路,那么可以不用管哪里出发(这个很显然)
发现N很小!很自然地可以往插头DP方面想。用括号序表示插头的联通状态即可。(手算一下发现当n=5,有用的状态只有21个)。
M却很大,但是21 * 21 * 21很小,所以可以矩阵乘法优化。
注意:由于是一条回路,在中间的部分不能转移到插头状态#####,只有最后f[m][n]才能转移到#####,也就是做矩阵乘法求出f[m-1][n],然后最后一行暴力。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=113,mo=1e9+7;
typedef long long LL;
int n,m,p,q,ans,id[799],tot,Sta[25];
s