/*
UVA 10601 Cubes
http://blog.csdn.net/acm_cxlove/article/details/7866192
http://www.cnblogs.com/staginner/archive/2012/05/21/2511340.html
1.本质不同的置换
2.循环节个数,其分别长度
(每个循环节中图相同的颜色的种数)/(本质不同的置换)
*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long lld;
const int maxn=20;
int a[maxn];
int b[maxn];
lld C[maxn][maxn];
void init(){
int i,j;
for(i=0;i<maxn;i++)
C[i][0]=C[i][i]=1;
for(i=1;i<maxn;i++)
for(j=1;j<i;j++)
C[i][j]=C[i-1][j-1]+C[i-1][j];
}
lld Solve(int k){
lld ret=1;
int i,j;
int n=0;
for(i=0;i<6;i++)
if(b[i]%k==0){
b[i]/=k;
n+=b[i];
}else
return 0;
for(i=0;i<6;i++){
ret*=C[n][b[i]];//n个不同的循环节中选b[i]个图i这种颜色
n-=b[i];
}
return ret;
}
lld s_rota(){
memcpy(b,a,sizeof(a));
return Solve(1);
}
lld p_rota(){
memcpy(b,a,sizeof(a));
lld ret=3*2*Solve(4);
memcpy(b,a,sizeof(a));
ret+=3*Solve(2);
return ret;
}
lld l_rota(){
memcpy(b,a,sizeof(a));
return 4*2*Solve(3);
}
lld e_rota(){
int i,j,k;
lld ret=0;
for(i=0;i<6;i++)
for(j=0;j<6;j++){
memcpy(b,a,sizeof(a));
b[i]--;b[j]--;
if(b[i]<0 || b[j]<0)continue;
ret+=6*Solve(2);
}
return ret;
}
lld Gao(){
lld ret=0;
ret+=s_rota();
// printf("%I64d\n",s_rota());
ret+=p_rota();
// printf("%I64d\n",p_rota());
ret+=e_rota();
// printf("%I64d\n",e_rota());
ret+=l_rota();
// printf("%I64d\n",l_rota());
return ret/24;
}
int main(){
int T;
int t;
int i,j,k;
init();
scanf("%d",&T);
while(T--){
memset(a,0,sizeof(a));
for(i=0;i<12;i++){
scanf("%d",&t);
a[t-1]++;
}
printf("%lld\n",Gao());
}
return 0;
}
UVA 10601 Cubes
最新推荐文章于 2020-04-20 16:38:36 发布