All Latin Squares 拉丁正方形
一种正方形的数字编排
1 2 3 4 5
2 1 4 5 3
3 4 5 1 2
4 5 2 3 1
5 3 1 2 4
是一个5*5 的拉丁正方形,每个1 到5 的整数在每行每列都出现且出现一次.
写个程序计算N*N 的的拉丁正方形的总数且要求第一行是:
1 2 3 4 5.......N
你的程序应该算称呼任意的从2 到7 的N(Your program should work for any N from 2 to 7)
PROGRAM NAME: latin
INPUT FORMAT
一行包含一个整数N
SAMPLE INPUT (file latin.in)
5
OUTPUT FORMAT
只有一行没,表示拉丁正方形的个数,且拉丁正方形的第一行为 1 2 3 . . . N.
SAMPLE OUTPUT (file latin.out)
1344
分析:这题……n<=7……打表可海星啊……
貌似n并不大,于是我们爆搜……然后T……
看来还是要优化的。有个容易想的优化:只搜1~n-1行
还有2个优化:
- 将第一列填1~n,总数*(n-1)!
- 置换群优化:求第二行的置换圈的最长长度,若搜完前两行时,两种情况中第二行的置换圈的最长长度相同,它们等价。其中置换圈就是将i和a[2][i]建无向边后得到的环,它的长度也就是换的大小。这个其实也很好理解,考虑第二行:1 2 5 3 4 和第二行:2 1 4 5 3,那么前者的1/2/3/4/5列等价于后者的2/1/4/5/3列。