Usaco Training Section 6.5 All Latin Squares

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. 将第一列填1~n,总数*(n-1)!
  2. 置换群优化:求第二行的置换圈的最长长度,若搜完前两行时,两种情况中第二行的置换圈的最长长度相同,它们等价。其中置换圈就是将i和a[2][i]建无向边后得到的环,它的长度也就是换的大小。这个其实也很好理解,考虑第二行:1 2 5 3 4 和第二行:2 1 4 5 3,那么前者的1/2/3/4/5列等价于后者的2/1/4/5/3列。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值