设G是p个对象的一个置换群,用k种颜色染这p个对象,若一种染色方案在群G的作用下变为另一种方案,则这两个方案当做是同一种方案,这样不同染色方案数为
HDU 1812例题
一共有8个置换,其中4个翻转(上下,左右,右上,左上),4个旋转,计算出这个置换的循环节数,然后对k做幂运算相加
先看翻转
1上下翻转
需要分奇数偶数讨论,
n是奇数的话–中间一行不动,其循环节为n个(自己到自己),其他n-1行的所有元素发生两两互换,每两个数可以构成一个循环节共计((n-1)/2 ) * n个;
n是偶数的话,所有的元素发生对换,攻击(n*n)/2个循环节
2左右翻转 ————同上下
3右上翻转——沿对角线翻转
对角线元素没有发生改变共n个循环节,其他所有元素发生两两对换,攻击(nn-n)个点发生对换,所以(nn-n)/2+n个循环节
4左上—同右上
旋转
一个结论:n个珠子串成环状,顺时针旋转i格的置换中,循环的个数为gcd(n,i),每个循环的长度为n/gcd(n,i);
所以把矩阵的每一层都看成一个环,每次计算gcd相加即为最终结果(特别考虑矩阵中间可能会有一份不动的点)
90°时发生如下的交换
可以发现最外层共4(n-1)个元素的旋转度为从1位置到2位置旋转度为n-1
第二层同理,可以用for循环直接求出结果
int cnt=0;
for(int i=n-1;i>=0;i-=2)
{
if(i==0)//中间一个不动点的情况
cnt++;//本身一个循环节
else cnt+=__gcd(4*i,i);
}
同理我们可以看出旋转180,270的最外层旋转读为2(n-1),3(n-1);
可以用上述方法求出;
旋转0,就是不动,自己本身构成循环节共n*n个;
利用上述求出的循环节数量,然后对k做幂运算相加即为最终结果
经检测,本题需要用到大数来进行计算,感兴趣可以写一些。