#P1711. Puncher

    ID: 712 传统题 1000ms 256MiB 尝试: 2 已通过: 1 难度: 10 上传者: 标签>组合数学容斥原理Northeastern Europe 1997

Puncher

描述

打孔器是一种带有多根针的设备,用于在车票上打孔。在工厂里,有一个MMNN列的矩形模板,如图所示(M=3M = 3N=4N = 4),可以用它制作带有1122\cdotsM×NM\times N根针的不同打孔器。针的行和列相互垂直,行与行之间的距离等于列与列之间的距离。显然,用这种方式可以制作出2M×N12^{M\times N}-1种不同的打孔器。

然而,有时无法区分由不同打孔器打出的车票。假设在打孔时,车票的两条相对边与针的行平行,另外两条相对边与针的列平行。打孔车票上的孔的数量总是等于相应打孔器上针的数量。允许进行以下变换的组合操作: 车票可以从任意一侧打孔(轴对称)。 车票可以以它的四条边中的任意一条朝下插入打孔器(旋转9090度、180180度和270270度)。 也允许进行平行移动。

你的任务是编写一个程序,来确定用一个M×NM\times N的模板实际上可以制作出多少种不同的打孔器。如果使用上述任何组合操作都无法使两个打孔器打出的车票上的孔匹配,那么这两个打孔器就被认为是实际上不同的。

输入

输入文件包含两个正整数MM(不大于44)和NN(不大于88),它们之间用一个空格分隔。

输出

输出文件包含一个整数,表示实际上不同的打孔器的数量。

输入数据 1

3 3

输出数据 1

85

来源

1997 年欧洲东北部地区竞赛