NYOJ 535 数棋盘 Count the Tetris

来源:互联网 发布:济南联通软件研究院 编辑:程序博客网 时间:2024/04/27 19:51






Count the Tetris


数棋盘

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述
一个有N×N个格子的正方形棋盘,每个格子可以用C种不同颜色来染色,一共可以得到多少种不同的棋盘。如果一个棋盘,经过任意旋转,反射后变成另一个棋盘,这两个棋盘就是属于同一种棋盘。

比如当N=C=2的时候,有下面六种不同的棋盘:

现在告诉你N和C,请你算算,到底有多少种不同的棋盘.

输入
本题目包含多组测试,请处理到文件结束。
每组测试数据包含两个正整数N和C(0<N,C,<31),分别表示棋盘的大小是N×N,用C种颜色来进行染色。
输出
对于每组测试,在一行里输出答案。
样例输入
2 23 1
样例输出
61

题目描述: 
一个有N×N个格子的正方形棋盘,每个格子可以用C种不同颜色来染色,一共可以得到多少种不同的棋盘。如果一个棋盘,经过任意旋转,翻转后变成另一个棋盘,这两个棋盘就是属于同一种棋盘。(0<N,C,<31) 

分析: 
很明显这个题目要用polya定理,和经典的着色计数问题不同的是经过翻转得到的棋盘和原来的棋盘也是属于同一种棋盘的。其实如果你那个问题的推导理解了,这个是一样的。 
根据Polya定理的公式: 
(m表示m种颜色) 

首先,我们要确定置换群,很明显只有两种置换:旋转和翻转。 
旋转分为:转0、转90、转180、转270; 
翻转分为:水平翻转和垂直翻转; 
看上去好像是有12种组合,其实不知大家有没注意到转180&#61616;再旋转和转0&#61616;再旋转是一样的,同样,转270再旋转和转90再旋转是一样的。 
所以,置换群G={转0,转90,转180,转270,转0再水平翻转,转0垂直翻转,转90再水平翻转,转90垂直翻转},|G|=8。 

然后,再考虑每种情况的循环节数: 
N为偶数时: 
1 2 
4 3 

转01,2,3,4)=(1)(2)(3)(4) 循环个数:4 n*n 
转90:(4,1,2,3)=(1,4,3,2) 循环个数:1 n*n/4 
转180:(3,4,1,2)=(1,3)(2,4) 循环个数:2 n*n/2 
转270:(2,3,4,1)=(1,2,3,4) 循环个数:1 n*n/4 
转0再水平翻转:(2,1,4,3)=(1,2)(3,4) 循环个数:2 n*n/2 
转0再垂直翻转:(4,3,2,1)=(1,4)(2,3) 循环个数:2 n*n/2 
转90再水平翻转:(1,4,3,2)=(1)(2,4)(3)循环个数:3 (n*n+n)/2 
转90再垂直翻转:(3,2,1,4)=(1,3)(2)(4)循环个数:3 (n*n+n)/2 
(关于公式的推导,可以多思考分析一下,多画几个出来可能就能够看出来了,如果还有问题可以来跟我讨论下,这里就不再证明推导了。) 
同样的道理可以推出奇数的情况。 
转0:n*n 
转90:(n*n+3)/4 
转180:(n*n+1)/2 
转270:(n*n+3)/4 
转0再水平翻转:n*n/2+n 
转0再垂直翻转:n*n/2+n 
转90再水平翻转:(n*n+n)/2 
转90再垂直翻转:(n*n+n)/2 

最后,再带入polya定理的公式,再考虑下题目数据,格式方面有没有什么特殊的地方,这个问题就解决了。比如说这个题目,因为0<N,C,<31,故要用大数处理。还有这个题目我当时比赛的时候直接计算而且用二分求幂优化,结果还是TLE了很多次,所以建议做这个题目时要预处理一下,先把所有结果都计算并保存。 打表过的^_^

这三步也是用polya定理解题目的一般思路。

原文链接http://hi.baidu.com/kikoqiu/item/c6b4a3599037ea08e6c4a58f
原创粉丝点击