HDU1812——————Count the Tetris(思路)

设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做幂运算相加即为最终结果

经检测,本题需要用到大数来进行计算,感兴趣可以写一些。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值