topcoder Single Round Match 457 Round 1 - Division I, Level Two baTheHexagonsDivOne

把1到2*n填入下图中:


使得相邻的两个数模n不同余,考虑旋转,有多少种填法。

1到2*n中模n有n种答案,每种两个。中间的有2*n中填法,后面的只能选择剩下的模n为另外n-1个结果的数字。只有4种情况

1+1+1+1+1+1

1+1+1+1+2

1+1+2+2

2+2+2

考虑旋转的排列时只要固定一个数的位置,再去考虑其他数字就可以了。

第一种情况先在模n的n-1个答案中选6个,然后每种的2个中选1个,固定一个,剩下5!种排法:

C(n-1,6)*2^6*5!

第二种情况先在模n的n-1个答案中选5个,5个中选一个作为出现2次的,然后剩下的每种的2个中选1个。再考虑排列,把出线两次的中的一个固定在1号位置,考虑另一个能放得位置就可以了。

C(n-1,5)*C(5,1)*2^4*(3*4!)

剩下的以此类推即可。关键是注意到环排列就是固定一个数的位置,再去考虑剩下位置的排列。固定的尽量选特殊的数字,即出现两次的数字就能简化计算。只有6个数,纸上推一下就可以了。


#include <bits/stdc++.h>
#define maxn 200
using namespace std;
long long C[maxn][maxn];
class TheHexagonsDivOne
{
public: long long count(int n)
	{
		for(int i=0;i<maxn;i++)
		{
			C[i][0]=C[i][i]=1;
			for(int j=1;j<i;j++)
				C[i][j]=C[i-1][j]+C[i-1][j-1];
		}
		long long ans=2*n;
		ans=ans*(7680*C[n-1][6]+1152*5*C[n-1][5]+192*6*C[n-1][4]+32*C[n-1][3]);
		return ans;
	}
};



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值