组合数学(Pólya计数原理):UvaOJ 10601 Cubes

Cubes

You are given 12 rods of equal length. Each of them is colored in certain color. Your task is to determine in how many different ways one can construct a cube using these rods as edges. Two cubes are considered equal if one of them could be rotated and put next to the other, so that the corresponding edges of the two cubes are equally colored.

Input

The first line of input contains T (1≤T≤60), the number of test cases. Then T test cases follow. Each test case consists of one line containing 12 integers. Each of them denotes the color of the corresponding rod. The colors are numbers between 1 and 6.

Output

The output for one test consists of one integer on a line - the number of ways one can construct a cube with the described properties.


Sample Input


Sample Output


3

1 2 2 2 2 2 2 2 2 2 2 2

1 1 2 2 2 2 2 2 2 2 2 2

1 1 2 2 3 3 4 4 5 5 6 6


1

5

312120

Problem source: Bulgarian National Olympiad in Informatics 2003

Problem submitter: Ivaylo Riskov

Problem solution: Ivaylo Riskov, K M Hasan

  除去找规律的那一部分,这道题是一道好题。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 const int maxn=15;
 6 int a[maxn][maxn]={
 7     {12,1,1,1,1,1,1,1,1,1,1,1,1},
 8     {3,4,4,4},{6,2,2,2,2,2,2},
 9     {7,1,1,2,2,2,2,2},{4,3,3,3,3},
10 };
11 int b[maxn]={1,6,3,6,8};
12 int c[maxn];
13
14 int DFS(int p,int id){
15     if(p>a[id][0])
16         return 1;
17     int ret=0;
18     for(int i=1;i<=6;i++)//every color
19         if(c[i]>=a[id][p]){
20             c[i]-=a[id][p];
21             ret+=DFS(p+1,id);
22             c[i]+=a[id][p];
23         }
24     return ret;
25 }
26
27 int main(){
28     int T,ans;
29     scanf("%d",&T);
30     while(T--){
31         memset(c,0,sizeof(c));
32         for(int i=1,x;i<=12;i++){
33             scanf("%d",&x);c[x]+=1;
34         }
35         ans=0;
36         //every kind of permutation
37         for(int i=0;i<=5;i++)
38             ans+=DFS(1,i)*b[i];
39         //b[i]: the number of the iTH permutation
40         printf("%d\n",ans/24);
41     }
42     return 0;
43 }
时间: 2024-10-10 02:59:37

组合数学(Pólya计数原理):UvaOJ 10601 Cubes的相关文章

【组合数学】计数原理

计数原理     ①抽屉原理               有N个抽屉,N+1个苹果,那么至少有一个抽屉有两个或两个以上的苹果.               有N个抽屉,N-1个苹果,那么至少有一个抽屉没有苹果.       ②加法原理         如果A类物品有a个,B类物品有b个,那么A类物品或B类物品共有a+b个(没有性质相同的情况下)       ③乘法原理         如果A有a中发生方式,B有b中发生方式,那么发生事件A与B有a*b中发生方式.       ④容斥原理 ∪=并

数学计数原理(P&#243;lya,高精度):SGU 294 He&#39;s Circles

He's Circles He wrote n letters "X" and "E" in a circle. He thought that there were 2n possibilities to do it, because each letter may be either "X" or "E". But Qc noticed that some different sequences of letters ca

10601 - Cubes(Ploya)

UVA 10601 - Cubes 题目链接 题意:给定正方体12条棱的颜色,要求用这些棱能组成多少不同的正方体 思路:利用ploya定理去求解,分类讨论,正方体一共24种旋转.相应的旋转方式有4种: 1.不动 2.沿两面中点连线旋转 3.沿对顶点连线旋转 4.沿两棱中点连线旋转 简单推算出每种情况相应的循环组数.在加上组合数学去进行选择颜色求解.注意第4种情况中,有两条棱和其它的循环长度是不同的,能够枚举然后扣掉讨论. 代码: #include <stdio.h> #include <

《Mathematical Olympiad——组合数学》——抽屉原理

抽屉原理可以说是组合数学中最简单易懂的一个原理了,其最简单最原始的一个表达形式:对于n本书放到n-1个抽屉中,保证每个抽屉都要有书,则必存在一个抽屉中有2本书.但是这个简单的原理在很多问题中都能够巧妙的应用到,融合将问题一步步抽象转化来接近抽屉原理的原始模型,是用好抽屉原理的关键. 问题一:两个半径相等的圆盘上各有一个内接正2n边形,每个正2n边形的顶点有一半染上黄色,一般染上蓝色,将这一个圆盘放在另一个圆盘上并使得两个正2n边形的顶点均重合,这样得到2n对顶点,如果一对顶点中两个重合的顶点颜色

《Mathematical Olympiad——组合数学》——计数

今天开始了对<Mathematical Olympiad>小丛书(组合.几何.代数.数论)的组合数学部分的学习.说来惭愧,身为一个大学生现在回头去做高中生玩的数学题去了……学习这套丛书嘛,当然是为了夯实一下数学底子,为了以后走更远的路打好基础.这套丛书的特点是从1往后一直排的习题集,目前个人比较喜欢以解决具体的题目为目的,然后在解题过程中去学习相关的理论和方法.因为这样让学习显得很有目的性,最重要的是,这种方法能够让人持续的做下去(起码是我).总之今天是个开始,希望在今后的岁月里能够坚持下来,

专题——计数原理

由于最近在研究数论,所以这期为大家带来一个数论中的专题--计数原理,下面我们来看四个概念: 一.配对原理: 对于集合A.B,如果存在一个一一映射,f:A→B,则|A|=|B|,假如我们很难计算A的值,不如转变方法,先计算B的值,再根据一一映射反推A,这时就需要找到这样一个易于计算的B,这需要很高的技巧.二.容斥原理: <1>容斥原理 把集合A分成子集A1,A2,A3,-,Am,即:A=A1∪A2∪A3-∪Am ,简单的来说,要求的集合是等于全集减去所有子集相交的重复的部分. <2>

uva 10601 - Cubes(置换)

题目链接:uva 10601 - Cubes 题目大意:有12根等长的小木棍,然后每根木棍,输入每根木棍颜色的编号,你的任务是统计出用它们拼出多少种不同的立方体,旋转之后完全相同的立方体被认定相同. 解题思路:polya,然后对应立方体有24种旋转: 不旋转(still):1种,循环长度为12 以对顶点为轴(rot_point):4组,循环长度为3 以对面中心为轴(rot_plane):3组,分别有90,180,270度旋转,分别对应循环长度3,2,3 以对边为轴(rot_edge):6组,除了

[从头学数学] 第195节 计数原理

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第五转的修炼. 这次要研究的是[计数原理]. 正剧开始: 星历2016年04月25日 10:22:16, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起研究[计数原理]. <span style="font-size:18px;"> if (1) { var r = 20; config.setSector(1,10,1,1.5); config.graphPaper2D(0, 0

STM32F4_TIM基本延时(计数原理)

Ⅰ.概述 STM32的TIM定时器分为三类:基本定时器.通用定时器和高级定时器.从分类来看就知道STM32的定时器功能是非常强大的,但是,功能强大了,软件配置定时器就相对复杂多了.很多初学者甚至工作了一段时间的人都不知道STM32最基本的计数原理. 虽然STM32定时器功能强大,也分了三类,但他们最基本的计数部分原理都是一样的,也就是我们常常使用的延时(或定时)多少us.ms等. 接下来我会讲述关于STM32最基本的计数原理,详细讲述如何做到(配置)计数1us的延时,并提供实例代码供大家参考学习