UVA 10601 Cubes (组合数学 + ploya计数)

原创 2015年11月17日 17:15:07

题意:

有12根等长火柴,每根火柴的颜色是6种颜色中的一种,输入每根火柴的颜色,求构成的立方体有多少种,旋转后完全相同的立方体视为相同。

思路:

一直以来只理解了ploya的皮毛。。所以看见这种题,可以求出置换种类,循环节个数,长度。。但依然不会计算。
一个立方体的旋转置换有24种,分别是:

  • 静止不动(包含1种置换),循环节有12个,每个长度为1;

  • 以对顶点的连线为轴,旋转120°,240°(包含4 × 2 = 8种置换),两种旋转角度的循环节均有4个,长度为3;

  • 以对边中点的连线为轴,旋转180°(包含6 × 1 = 6种置换),这种置换有两种长度的循环节,分别是轴所在对边构成的两个长度为1的循环节,以及其他边构成的5个长度为2的循环节;

  • 以对面中心的连线为轴,旋转90°,180°,270°(包含3 × 3 = 9种置换),旋转90°与270°的置换有3个长度为4的循环节,旋转180°的置换有6个长度为2的循环节。

知道置换种类与对应的循环节个数与长度后,就可以用组合计数的方式来统计每种置换的方案数,计算方式就是把12根火柴分成每一种置换的各个循环,如果不能分,即12不能整除循环节长度则该置换方案数为0.
处理有不同长度循环节的置换,可以将其拆分开来统计。

(看到有人用6维背包做,惊为天人。。

代码:

#include<bits/stdc++.h>
using namespace std;

typedef unsigned long long lint ;
lint C[13][13] ;
int cnt[7], a[7] ;
void init()
{
    C[0][0] = 1;
    for (int i = 1; i < 13; i++) {
        C[i][0] = 1;
        for (int j = 1; j < i + 1; j++) {
            C[i][j] = C[i-1][j] + C[i-1][j-1] ; ;
        }
    }
}

lint count(int k) 
{
    int n = 0 ;
    for (int i = 0; i < 6; i++) {
        if (cnt[i] % k == 0) {
            cnt[i] /= k ;
            n += cnt[i];
        }
        else return 0 ;
    }
    lint ret = 1 ;
    for (int i = 0; i < 6; i++) {
        ret *= C[n][cnt[i]] ;
        n -= cnt[i] ;
    }
    return ret ;
}
lint still()
{
    memcpy(cnt, a, sizeof a) ;
    return count(1) ;
}
lint point()
{
    memcpy(cnt, a, sizeof a) ;
    return 8 * count(3) ;
}
lint edge()
{
    lint ret = 0 ;
    for (int i = 0; i < 6; i++)
        for (int j = 0; j < 6; j++) {
            if (!a[i] || !a[j]) continue ;
            memcpy(cnt, a, sizeof a) ;
            cnt[i]-- ; cnt[j]-- ;
            ret += 6 * count(2) ;
        }
    return ret ;
}
lint plane()
{
    lint ret = 0 ;
    memcpy(cnt, a, sizeof a) ;
    ret += 3 * count(2) ;
    memcpy(cnt, a, sizeof a) ;
    ret += 6 * count(4) ;
    return ret ;
}
void work()
{
    lint ans = 0 ;
    ans += still() ;
    ans += point() ;
    ans += edge() ;
    ans += plane() ;
    cout << ans / 24 << endl ;
}
int main()
{
    init() ;
    int t ; cin >> t ;
    while (t-- ){
        memset(a, 0, sizeof a) ;
        for (int i = 0; i < 12; i++) {
            int col ; scanf("%d", &col) ;
            a[col-1]++ ;
        }
        work() ;
    }
    return 0;
}
版权声明:博主表示授权一切转载啦,不过要写上原作者哦:)

UVa253 Cube painting(骰子涂色)(27行,比较简洁的样子)

算法竞赛入门宝典(第2版)习题4-4骰子涂色(Cube painting,UVa253)  Cube painting  #include #include using namespace s...
  • ProLightsfxjh
  • ProLightsfxjh
  • 2015年10月03日 00:27
  • 3611

【学习】python开源框架

1.Django: Python Web应用开发框架,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。 2. Diesel:基...
  • shandianke
  • shandianke
  • 2014年09月14日 22:10
  • 6013

UVa 11401 数三角形(组合数学)

数三角形(Triangle Counting, UVa 11401) 有多少种方法可以从1, 2, 3, …, n中选出3个不同的整数, 使得以 它们为三边长可以组成三角形? 比如n=5时有...
  • update7
  • update7
  • 2017年07月19日 14:37
  • 17183

UVA 10601 Cubes(正方体旋转、Polya计数)

题目链接: UVA 10601 Cubes 题意: 给出12根等长的火柴棒,每根火柴棒的颜色属于1−61-6中的一种,问能拼成多少种不同的正方体?(考虑旋转变换) 分析: 首先正方体的旋转置...
  • Ramay7
  • Ramay7
  • 2016年07月10日 14:52
  • 406

UVA 10601 Cubes (Polya计数)

题意:给出
  • qian99
  • qian99
  • 2014年04月15日 11:06
  • 543

UVA 10601 CUBES (正方体Polya,有限制)

转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents           by---cxlove 题目:有12条边,分别有特定...
  • ACM_cxlove
  • ACM_cxlove
  • 2012年08月14日 18:46
  • 2991

UVA 10601 CUBES (正方体Polya,有限制)

转自 http://blog.csdn.net/ACM_cxlove?viewmode=contents           by---cxlove 题目:有12条边,分别有特定的颜色,...
  • qq_31843751
  • qq_31843751
  • 2017年11月22日 18:30
  • 20

UVA 10601 CUBES (正方体Polya,有限制)

题目:有12条边,分别有特定的颜色,组成一个立方体,问有多少种 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemi...
  • hlmfjkqaz
  • hlmfjkqaz
  • 2013年08月02日 20:46
  • 507

BZOJ1900: Uva10601 Cubes

burnside的定理。。。然后看到1s的时限整个人都炸了!!!! 好吧  那我就打表好了23333 (1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12) (2 3 4 ...
  • liutian429073576
  • liutian429073576
  • 2015年12月27日 21:13
  • 438

UVA 10177 (2/3/4)-D Sqr/Rects/Cubes/Boxes? 简单数学题

给出一个大小是N的正方形中正方形的
  • u013738743
  • u013738743
  • 2014年07月07日 22:25
  • 578
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA 10601 Cubes (组合数学 + ploya计数)
举报原因:
原因补充:

(最多只允许输入30个字)