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

来源:互联网 发布:中国乘用车8月销量数据 编辑:程序博客网 时间:2024/05/23 17:14

把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 200using 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 0