HDU 4633(polya计数

题目:用k种颜色给一个魔方染色,可以染每个面的9个小矩形,12条棱,8个顶点(总之就是有74个能染的地方),空间旋转后一样的视为相同,问有多少种不同的染色方案。

思路:裸的polya计数,但是这个立方体的对称群本来就很容易弄错。。。《组合数学》里有个例题提到立方体的对称群有24个元素,分别是:

(1)恒等变换。

(2)以两个相对面的中心相连作为对称轴,旋转(i)90,(ii)180,(iii)270度,每种有3个。共9种。

(3)以两个相对棱的中点连线为对称轴翻转180度,有6种。

(4)固定两个相对顶点旋转(i)120,(ii)240度,共8种。

Burnside引理指出,在一个对称变换群作用下不同的染色数目等于每种变换作用下不动点个数的平均数。

但是此题直接求不动点恐怕只能写暴力程序跑了。。。polya定理实际上是Burnside引理稍微一般化了一下。polya定理提出了一种计算不动点数目的较为简便的方法,就是计算在每种映射下,映射中“环”的数目。这个可以通过列表比较清楚地得出。(polya定理还给出了更一般的通过母函数法求解限制每种颜色涂色的数目的方法,但是此题不需要)

那么我们可以得出下表:

面                              棱                              顶点

(2) (i) (iii)  (2,0,0,13)          (0,0,0,3)                          (0,0,0,2)

(2) (ii)       (2,26,0,0)          (0,6,0,0)                          (0,4,0,0)

(3)            (0,27,0,0)          (2,5,0,0)                          (0,4,0,0)

(4)(i)(ii)     (0,0,18,0)          (0,0,4,0)                          (2,0,2,0)

(列表方法见《组合数学》Brualdi)

然后就是一发公式交上去就能AC了

/*
* @author:  Cwind
*/

///#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <map>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <set>
#include <cmath>

using namespace std;
#define pb push_back
#define PB pop_back
#define bk back()
#define fs first
#define se second
#define sq(x) (x)*(x)
#define eps (1e-10)
#define INF (1000000300)
#define clr(x) memset((x),0,sizeof (x))
#define cp(a,b) memcpy((a),(b),sizeof (b))

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;

const ll mod=10007;
ll qpow(ll a,ll p){
    ll ans=1;
    while(p){
        if(p&1) ans=ans*a%mod;
        a=a*a%mod;
        p>>=1;
    }
    return ans;
}
int T,K;
int inv=qpow(24,mod-2);
int cas;
int main(){
    freopen("/home/slyfc/CppFiles/in","r",stdin);
    cin>>T;
    while(T--){
        scanf("%d",&K);
        ll ans=qpow(K,74)+6*qpow(K,20)+9*qpow(K,38)+8*qpow(K,26);
        ans%=mod;
        ans*=inv;
        ans%=mod;
        printf("Case %d: %lld\n",++cas,ans);
    }
    return 0;
}

时间: 2024-10-13 15:15:19

HDU 4633(polya计数的相关文章

hdu 1812 Count the Tetris polya计数

哈哈哈,简单polya,公式自己推导. 不过这题需要用到大数,很久没写Java,调了好久. import java.math.*; import java.util.*; import java.io.*; public class Main{ public static void main(String args[]){ Scanner cin=new Scanner(System.in); int n; BigInteger c; while(cin.hasNextInt()) { BigI

Polya计数

Let it Bead Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5365   Accepted: 3585 Description "Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. As you can deduce from the company name, their business is b

组合数学及其应用——polya计数

在处理类似下面的问题中,一般的计数方法会出现问题:假如你要用红.蓝两种颜色给一个正四面体的四个顶点着色,试问存在多少种不同的着色方案? 在高中我们常用的方法是模拟涂色过程,分情况讨论,然后基于分步乘法原理.但是在那里没有考虑几何体通过旋转等操作带来的对称性,在本文中,我们就来介绍一种专门处理这类问题的工具——Polya计数. 首先我们要做的是引入一些基本的概念. 置换: 关于置换更多的细节我们在<抽象代数基础教程>中继续讨论,这里我们只需简单的了解其概念即可. 关于置换还需要了解的就是它的合乘

UVALive - 3641 Leonardo&#39;s Notebook(polya计数)

题意:给出26个大写字母的置换B,问是否存在一个置换A,使A*A=B? 两个长度为N的相同循环相乘,当N为奇数时结果也是一个长度为N的循环,当N为偶数时分裂为两个长度为N/2的循环.相反,对于一个任意长度为N的奇数循环B,都能找到一个长度为N的循环A使得A*A=B,对于任意两个长度为N(N不一定为偶数)的不相交循环B和C,都能找到一个长度为2N的循环A使得A*A=B*C. 于是只要判断置换B里循环长度相同的且都为偶数(2,4,6, 8.....)的循环个数是不是都为偶数(偶数就能两两配对),只要

[ACM] POJ 2154 Color (Polya计数优化,欧拉函数)

Color Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7630   Accepted: 2507 Description Beads of N colors are connected together into a circular necklace of N beads (N<=1000000000). Your job is to calculate how many different kinds of th

hdu 4909 String(计数)

题目链接:hdu 4909 String 题目大意:给定一个字符串,由小写字母组成,最多包含一个问号,问号可以表示空或者任意一个字母.问有多少个子串,字母出现的次数均为偶数. 解题思路:因为最多又26个字母,对应每个字母的奇数情况用1表示,偶数情况用0.将一个前缀串表示成一个二进制数.然后对于每种相同的数s,任选两个即为一种可行子串(组合数学). 接着对于有问号的情况枚举一下问号替代的字符,然后对于问号后面的状态都要再加上一个该字符.这时计算个数时就要将前后分开讨论了. 这题交C++,结果卡FS

poj 2154 Color(polya计数 + 欧拉函数优化)

http://poj.org/problem?id=2154 大致题意:由n个珠子,n种颜色,组成一个项链.要求不同的项链数目,旋转后一样的属于同一种,结果模p. n个珠子应该有n种旋转置换,每种置换的循环个数为gcd(i,n).如果直接枚举i,显然不行.但是我们可以缩小枚举的数目.改为枚举每个循环节的长度L,那么相应的循环节数是n/L.所以我们只需求出每个L有多少个i满足gcd(i,n)= n/L,就得到了循环节数为n/L的个数.重点就是求出这样的i的个数. 令cnt = gcd(i,n) =

[ACM] POJ 2409 Let it Bead (Polya计数)

Let it Bead Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4434   Accepted: 2916 Description "Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. As you can deduce from the company name, their business is b

[ACM] POJ 1286 Necklace of Beads (Polya计数,直接套公式)

Necklace of Beads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6547   Accepted: 2734 Description Beads of red, blue or green colors are connected together into a circular necklace of n beads ( n < 24 ). If the repetitions that are pro