设G是p个对象的一个置换群,用m种颜色涂染p个对象,则不同染色方案为:
其中G={g1,…gs} c(gi )为置换gi的循环节数(i=1…s)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define MOD 10007
int quickpow(int a,int b)
{
int t =1;
while (b >0)
{
if (b &1)
t = (t*a)%MOD;
b = b >>1 ;
a = (a*a)%MOD;
}
return t;
}
int main()
{
int T,k;
scanf("%d",&T);
for(int ca=1; ca<=T; ca++)
{
scanf("%d",&k);
int ans=quickpow(k,54+12+8);//不变置换
ans=((ans+(6*quickpow(k,15+3+2))%MOD)%MOD+(3*quickpow(k,28+6+4))%MOD)%MOD;//沿对面中点轴旋转90、270度
ans=(ans+(6*quickpow(k,27+7+4))%MOD)%MOD;//沿对边中心轴旋转180度
ans=(ans+(8*quickpow(k,18+4+4))%MOD)%MOD;//沿对角线旋转120、240度
ans=(ans*quickpow(24,MOD-2))%MOD;
printf("Case %d: %d\n",ca,ans);
}
return 0;
}

本文介绍了一种基于置换群理论的染色方案计数算法。该算法应用于计算使用m种颜色对p个对象的不同染色方案数量,考虑了各种置换操作的影响,并通过具体的代码实现展示了计算过程。
2087

被折叠的 条评论
为什么被折叠?



